library(tidyverse)
Registered S3 methods overwritten by 'dbplyr':
  method         from
  print.tbl_lazy     
  print.tbl_sql      
── Attaching packages ────────────────────────────────────────────────────────────────────────── tidyverse 1.3.1 ──
✓ ggplot2 3.3.5     ✓ purrr   0.3.4
✓ tibble  3.1.2     ✓ dplyr   1.0.6
✓ tidyr   1.1.3     ✓ stringr 1.4.0
✓ readr   1.4.0     ✓ forcats 0.5.1
── Conflicts ───────────────────────────────────────────────────────────────────────────── tidyverse_conflicts() ──
x tidyr::expand() masks Matrix::expand()
x dplyr::filter() masks stats::filter()
x dplyr::lag()    masks stats::lag()
x tidyr::pack()   masks Matrix::pack()
x tidyr::unpack() masks Matrix::unpack()
library(lme4)
library(ggpubr)
Registered S3 method overwritten by 'data.table':
  method           from
  print.data.table     
Registered S3 methods overwritten by 'car':
  method                          from
  influence.merMod                lme4
  cooks.distance.influence.merMod lme4
  dfbeta.influence.merMod         lme4
  dfbetas.influence.merMod        lme4
source("helpers.R")
bran_palette = c("#7ae7e5","#B2A6DE", "#fe5f55", "#14342b", "#69385c")

theme_set(theme_minimal())
lex_freqs <- read.csv("freq_preped.csv") %>%
  mutate(left_surprisal = (-log(mean_left_neutral))/(-log(mean_left_gendered))) %>%
  mutate(right_surprisal = (-log(mean_right_neutral))/(-log(mean_right_gendered)))
gender_transcendence_cols <- c('subject_information.gender_q1','subject_information.gender_q2','subject_information.gender_q3','subject_information.gender_q4','subject_information.gender_q5')

gender_linked_cols <- c('subject_information.gender_q6','subject_information.gender_q7','subject_information.gender_q8','subject_information.gender_q9','subject_information.gender_q10','subject_information.gender_q11','subject_information.gender_q12','subject_information.gender_q13')

Production Task Study

Methods

Analysis

Data Read-in

prod_data <- read.csv("production_data.csv")

Exclusions

prod_exclusion <- prod_data %>% filter(name=='attention') %>%
  group_by(workerid) %>%
  summarise(accuracy = mean(correct)) %>%
  mutate(exclude = ifelse(accuracy < 0.80,'Yes','No')) %>%
  filter(exclude == "Yes")
prod_data <- prod_data[!(prod_data$workerid %in% prod_exclusion$workerid),]

Additional Information

prod_data <- prod_data %>%
  mutate(gender_trans = 100 - (rowMeans(prod_data[gender_transcendence_cols]))) %>%
  mutate(gender_link = rowMeans(prod_data[gender_linked_cols])) 

gender_all = c('gender_trans','gender_link')

prod_data <- prod_data %>%
  mutate(gender_total = rowMeans(prod_data[gender_all]))
prod_data <- prod_data %>%
  filter(type == "critical") %>%
  mutate(response_gender = ifelse(response == "actress" | response == "anchorwoman" | response == "stewardess" | response == "businesswoman" | response == 'camerawoman' | response == 'congresswoman' | response == 'craftswoman' | response == 'crewwoman' | response == 'firewoman' | response == 'forewoman'  | response == 'heiress' | response == 'heroine' | response == 'hostess' | response == 'huntress' | response == 'laywoman' | response == 'policewoman' | response == 'saleswoman' | response == 'stuntwoman' | response == 'villainess' | response == 'weatherwoman',"female",ifelse(response == "anchor" | response == "flight attendant" | response == "businessperson" | response == 'camera operator' | response == 'congressperson' | response == 'craftsperson' | response == 'crewmember' | response == 'firefighter' | response == 'foreperson' | response == 'layperson' | response == 'police officer' | response == 'salesperson' | response == 'stunt double' | response == 'meteorologist',"neutral",ifelse(response == "anchorman" | response == "steward" | response == "businessman" | response == 'cameraman' | response == 'congressman' | response == 'craftsman' | response == 'crewman' | response == 'fireman' | response == 'foreman' | response == 'layman' | response == 'policeman' | response == 'salesman' | response == 'stuntman' | response == 'weatherman',"male",'male/neutral')))) %>%
  mutate(congruency = ifelse(gender == response_gender,"true","false")) %>%
  mutate(neutrality = ifelse(response_gender == "neutral","true","false"))%>%
  mutate(morph_type = ifelse(lexeme!= 'actor' & lexeme!= 'host' & lexeme !='hunter' & lexeme!= 'villain' & lexeme!= 'heir' & lexeme!= 'hero','compound','adoption')) %>%
  mutate(poli_party = ifelse(subject_information.party_alignment == 1 | subject_information.party_alignment == 2,'Republican',ifelse(subject_information.party_alignment == 4 | subject_information.party_alignment == 5,'Democrat','Non-Partisan')))

Responses by Political Ideology

prod_data %>% 
  filter(!is.na(poli_party)) %>%
  filter(morph_type =="compound") %>%
  ggplot(aes(x=poli_party, fill=response_gender)) + 
  geom_bar(position="fill") + 
  facet_wrap(~gender) + 
  scale_fill_manual(values = bran_palette) + 
  labs(x="Participant Political Party", fill="Gender of Response", y="Proportion of Responses", title="Gender of Response by Gender of Stimulus Name") + 
  theme(text=element_text(size=15)) + 
  theme(axis.text.x = element_text(angle=25))

ggsave("prod_all_poli.png", width=7,height=5,path='/Users/branpap/Desktop/gender_processing/talks_and_papers/qp_paper/figures')
prod_data %>% 
  filter(!is.na(subject_information.party_alignment)) %>%
  filter(morph_type =="compound") %>%
  ggplot(aes(x=subject_information.party_alignment, fill=response_gender)) + 
  geom_bar(position="fill") + 
  facet_wrap(~gender) + 
  scale_fill_manual(values = bran_palette) + 
  labs(x="Participant Political Party", fill="Gender of Response", y="Proportion of Responses", title="Gender of Response by Gender of Stimulus Name")

Gender of Response by Political Alignment and Gender Ideology

prod_data %>%
  filter(!is.na(poli_party)) %>%
  mutate(response_neutral = ifelse(response_gender == "neutral",1,0)) %>%
  filter(gender!="filler" & gender!= "attention" & gender!="" & morph_type=="compound") %>%
  group_by(gender,gender_total,poli_party) %>%
  summarise(proportion = mean(response_neutral)) %>%
  ggplot(aes(x=gender_total, y=proportion, color=gender)) +
    geom_point() + 
    geom_smooth() + 
    scale_color_manual(values = bran_palette) +
    facet_wrap(~poli_party) + 
    labs(x="Gender Ideology Score", y="Proportion of Gender Neutral Responses",color="Gender of Name Seen") + 
    theme(text=element_text(size=15))
`summarise()` has grouped output by 'gender', 'gender_total'. You can override using the `.groups` argument.
`geom_smooth()` using method = 'loess' and formula 'y ~ x'

ggsave("prod_neutral_poli.png", width=10,height=5,path='/Users/branpap/Desktop/gender_processing/talks_and_papers/qp_paper/figures')
`geom_smooth()` using method = 'loess' and formula 'y ~ x'
prod_data %>%
  filter(!is.na(poli_party)) %>%
  mutate(response_neutral = ifelse(response_gender == "neutral",1,0)) %>%
  filter(gender!="filler" & gender!= "attention" & gender!="") %>%
  group_by(gender,subject_information.age,poli_party) %>%
  summarise(proportion = mean(response_neutral)) %>%
  ggplot(aes(x=subject_information.age, y=proportion, color=gender)) +
    geom_point() + 
    geom_smooth() + 
    scale_color_manual(values = bran_palette) 
`summarise()` has grouped output by 'gender', 'subject_information.age'. You can override using the `.groups` argument.
`geom_smooth()` using method = 'loess' and formula 'y ~ x'
Warning: Removed 4 rows containing non-finite values (stat_smooth).
Warning: Removed 4 rows containing missing values (geom_point).

my_comparisons <- list( c("Democrat","Republican"),c("Democrat","Non-Partisan"),c("Republican","Non-Partisan"))
prod_data %>%
  filter(!is.na(poli_party)) %>%
  mutate(response_neutral = ifelse(response_gender == "neutral",1,0)) %>%
  filter(gender!="filler" & gender!= "attention" & gender!="") %>%
  filter(subject_information.gender == "Male" | subject_information.gender == "Female") %>%
  filter(poli_party != "Non-Partisan") %>%
  group_by(gender,workerid,poli_party,subject_information.gender) %>%
  summarise(proportion = mean(response_neutral)) %>%
  ggplot(aes(x=poli_party, y=proportion, fill=poli_party)) +
  geom_boxplot(varwidth = T) + 
  geom_jitter(alpha=0.1) + 
  scale_fill_manual(values=bran_palette) + 
  facet_grid(subject_information.gender~gender) + 
  theme(legend.position = "none") + 
  labs(x="Participant Political Party", y="Proportion",title="Mean Prop. of Neutral Responses by Stimuli Gender") + 
  theme(text=element_text(size=16)) + 
  theme(axis.text.x = element_text(angle=20)) + 
  stat_compare_means(label = "p.signif")
`summarise()` has grouped output by 'gender', 'workerid', 'poli_party'. You can override using the `.groups` argument.

prod_data %>%
  filter(!is.na(poli_party)) %>%
  mutate(response_neutral = ifelse(response_gender == "neutral",1,0)) %>%
  filter(gender!="filler" & gender!= "attention" & gender!="") %>%
  group_by(gender,workerid,poli_party,subject_information.gender) %>%
  summarise(proportion = mean(response_neutral)) %>%
  ggplot(aes(x=poli_party, y=proportion, fill=poli_party)) +
  geom_boxplot(varwidth = T) + 
  geom_jitter(alpha=0.1) + 
  scale_fill_manual(values=bran_palette) + 
  facet_wrap(~gender) + 
  theme(legend.position = "none") + 
  labs(x="Participant Political Party", y="Proportion",title="Mean Prop. of Neutral Responses by Stimuli Gender") + 
  theme(text=element_text(size=16)) + 
  theme(axis.text.x = element_text(angle=20)) 
`summarise()` has grouped output by 'gender', 'workerid', 'poli_party'. You can override using the `.groups` argument.

#%+ #  stat_compare_means(comparisons = my_comparisons, label = "p.signif")
ggsave("prod_neutral_poli_box.png", width=7, height=5,path='/Users/branpap/Desktop/gender_processing/talks_and_papers/qp_paper/figures')
prod_data %>%
  filter(!is.na(poli_party)) %>%
  mutate(response_neutral = ifelse(response_gender == "neutral",1,0)) %>%
  filter(gender!="filler" & gender!= "attention" & gender!="") %>%
  group_by(gender,poli_party) %>%
  summarise(proportion = mean(response_neutral)) %>%
  ggplot(aes(x=poli_party, y=proportion, fill=poli_party)) +
  geom_bar(stat="identity") + 
  scale_fill_manual(values=bran_palette) + 
  facet_wrap(~gender) + 
  theme(legend.position = "none") + 
  labs(x="Participant Political Party", y="Proportion",title="Mean Prop. of Neutral Responses by Stimuli Gender") + 
  theme(text=element_text(size=16)) + 
  theme(axis.text.x = element_text(angle=20)) 
`summarise()` has grouped output by 'gender'. You can override using the `.groups` argument.

gender_comparisons <- list( c("male","female"))
prod_data %>%
  filter(!is.na(poli_party)) %>%
  filter(poli_party != "Non-Partisan") %>%
  mutate(response_neutral = ifelse(response_gender == "neutral",1,0)) %>%
  filter(gender!="filler" & gender!= "attention" & gender!="") %>%
  group_by(gender,workerid,poli_party,subject_information.gender) %>%
  summarise(proportion = mean(response_neutral)) %>%
  ggplot(aes(x=gender, y=proportion, fill=gender)) +
  geom_boxplot(varwidth = T) + 
  geom_jitter(alpha=0.1) + 
  scale_fill_manual(values=bran_palette) + 
  facet_wrap(~poli_party) + 
  theme(legend.position = "none") + 
  labs(x="Stimuli Gender", y="Proportion",title="Mean Prop. of Neutral Responses by Stimuli Gender") + 
  theme(text=element_text(size=16)) + 
  theme(axis.text.x = element_text(angle=20)) 
`summarise()` has grouped output by 'gender', 'workerid', 'poli_party'. You can override using the `.groups` argument.

ggsave("prod_neutral_poli_box_gender.png", width=7, height=5,path='/Users/branpap/Desktop/gender_processing/talks_and_papers/qp_paper/figures')
prod_data %>%
  filter(!is.na(poli_party)) %>%
  mutate(response_neutral = ifelse(response_gender == "neutral",1,0)) %>%
  filter(gender!="filler" & gender!= "attention" & gender!="") %>%
  group_by(subject_information.gender,workerid,poli_party) %>%
  summarise(proportion = mean(response_neutral)) %>%
  ggplot(aes(x=poli_party, y=proportion, fill=poli_party)) +
  geom_boxplot(varwidth = T) + 
  geom_jitter(alpha=0.1) + 
  scale_fill_manual(values=bran_palette) + 
  facet_wrap(~subject_information.gender) + 
  theme(legend.position = "none") + 
  labs(x="Participant Political Party", y="Proportion",title="Mean Prop. of Neutral Responses by Stimuli Gender") + 
  theme(text=element_text(size=16)) + 
  theme(axis.text.x = element_text(angle=20)) + 
  stat_compare_means(comparisons = my_comparisons, label = "p.signif")
`summarise()` has grouped output by 'subject_information.gender', 'workerid'. You can override using the `.groups` argument.
Warning: Computation failed in `stat_signif()`:
not enough 'y' observations
Warning in wilcox.test.default(c(0.1, 0.05, 0.2, 0.3, 0.3, 0.25, 0.2, 0.3,  :
  cannot compute exact p-value with ties
Warning in wilcox.test.default(c(0.1, 0.05, 0.2, 0.3, 0.3, 0.25, 0.2, 0.3,  :
  cannot compute exact p-value with ties
Warning in wilcox.test.default(c(0.35, 0.2, 0.15, 0.15, 0.25, 0.1, 0.2,  :
  cannot compute exact p-value with ties
Warning: Computation failed in `stat_signif()`:
not enough 'y' observations

prod_data %>%
  filter(poli_party == "Democrat" | poli_party =="Republican") %>%
  mutate(response_neutral = ifelse(response_gender == "neutral",1,0)) %>%
  filter(gender=="male") %>%
  group_by(workerid,poli_party) %>%
  summarise(proportion = mean(response_neutral)) %>%
  ggplot(aes(x=poli_party, y=proportion, fill=poli_party)) +
  geom_boxplot(varwidth = T) + 
  geom_jitter(alpha=0.1) + 
  scale_fill_manual(values=bran_palette) + 
  theme(legend.position = "none") + 
  labs(x="Participant Political Party", y="Proportion",title="Mean Prop. of Neutral Responses by Stimuli Gender") + 
  theme(text=element_text(size=16)) + 
  theme(axis.text.x = element_text(angle=20)) + 
  stat_compare_means()
`summarise()` has grouped output by 'workerid'. You can override using the `.groups` argument.

prod_data %>%
  filter(poli_party == "Democrat" | poli_party =="Republican") %>%
  mutate(response_neutral = ifelse(response_gender == "neutral",1,0)) %>%
  filter(gender=="female") %>%
  group_by(workerid,poli_party) %>%
  summarise(proportion = mean(response_neutral)) %>%
  ggplot(aes(x=poli_party, y=proportion, fill=poli_party)) +
  geom_boxplot(varwidth = T) + 
  geom_jitter(alpha=0.1) + 
  scale_fill_manual(values=bran_palette) + 
  theme(legend.position = "none") + 
  labs(x="Participant Political Party", y="Proportion",title="Mean Prop. of Neutral Responses by Stimuli Gender") + 
  theme(text=element_text(size=16)) + 
  theme(axis.text.x = element_text(angle=20)) + 
  stat_compare_means()
`summarise()` has grouped output by 'workerid'. You can override using the `.groups` argument.

Gender by Gender, no Ideology

prod_data %>%
  filter(morph_type =="compound") %>%
  ggplot(aes(x=gender, fill=response_gender)) + 
  geom_bar(position="fill") + 
  scale_fill_manual(values = bran_palette) + 
  labs(x="Stimulus Gender", fill="Gender of Response", y="Proportion of Responses", title="Gender of Response by Gender of Stimulus Name") +
  theme_minimal()

Models

prod_data_compounds <- prod_data %>%
  filter(morph_type == "compound") %>%
  mutate(cgender_total = scale(gender_total)) %>%
  mutate(response_congruency = as.numeric(ifelse(congruency=="true","1","0"))) %>%
  mutate(cage = scale(subject_information.age)) %>%
  mutate(neutrality_binary = ifelse(neutrality=="true",1,0))
final_dat <- merge(prod_data_compounds,lex_freqs,by="lexeme") %>%
  mutate(neutrality_binary = ifelse(neutrality=="true",1,0)) %>%
  filter(morph_type == "compound") %>%
  mutate(cgender_total = scale(gender_total)) %>%
  mutate(response_congruency = as.numeric(ifelse(congruency=="true","1","0"))) %>%
  mutate(cage = scale(subject_information.age)) %>%
  mutate(cmean_left_neutral = scale(mean_left_neutral)) %>%
  mutate(mean_all = (mean_left_neutral + mean_right_neutral)/2) %>%
  mutate(cmean_all = scale(mean_all))
production_model_one <- lmer(neutrality_binary~cgender_total*poli_party + gender + cmean_all + (1|workerid) + (1|lexeme) + (1|name) + (1|cage),data=final_dat)
summary(production_model_one)
Linear mixed model fit by REML. t-tests use Satterthwaite's method ['lmerModLmerTest']
Formula: neutrality_binary ~ cgender_total * poli_party + gender + cmean_all +  
    (1 | workerid) + (1 | lexeme) + (1 | name) + (1 | cage)
   Data: final_dat

REML criterion at convergence: 3975.3

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-2.7375 -0.6993 -0.1105  0.7926  2.9613 

Random effects:
 Groups   Name        Variance  Std.Dev.
 workerid (Intercept) 0.0264195 0.16254 
 cage     (Intercept) 0.0021613 0.04649 
 name     (Intercept) 0.0002662 0.01632 
 lexeme   (Intercept) 0.0633306 0.25166 
 Residual             0.1481373 0.38489 
Number of obs: 3794, groups:  workerid, 271; cage, 31; name, 24; lexeme, 14

Fixed effects:
                                      Estimate Std. Error        df t value Pr(>|t|)    
(Intercept)                            0.53666    0.07108  14.67983   7.550 1.99e-06 ***
cgender_total                         -0.11912    0.02036 262.00393  -5.850 1.46e-08 ***
poli_partyNon-Partisan                -0.01318    0.03831 258.50483  -0.344 0.731161    
poli_partyRepublican                  -0.11234    0.02917 264.94213  -3.852 0.000147 ***
gendermale                            -0.11782    0.01427  21.89822  -8.256 3.61e-08 ***
cmean_all                              0.03931    0.06756  11.99948   0.582 0.571371    
cgender_total:poli_partyNon-Partisan   0.11801    0.04689 259.63915   2.517 0.012445 *  
cgender_total:poli_partyRepublican     0.11628    0.02812 264.67427   4.135 4.77e-05 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
            (Intr) cgndr_ pl_N-P pl_prR gndrml cmn_ll c_:_N-
cgender_ttl  0.109                                          
pl_prtyNn-P -0.135 -0.219                                   
pl_prtyRpbl -0.175 -0.294  0.332                            
gendermale  -0.100 -0.002 -0.001  0.002                     
cmean_all    0.000  0.000  0.000  0.000  0.002              
cgndr_:_N-P -0.050 -0.426  0.207  0.129 -0.008  0.000       
cgndr_tt:_R -0.076 -0.728  0.160 -0.034 -0.004  0.000  0.312

Some Prop Tables

(table(prod_data$subject_information.gender))

       Female   Male  Other 
    40   3380   1980     80 
prod_gender_table <- prod_data %>%
  group_by(workerid,subject_information.gender,poli_party) %>%
  summarise(subject_gender = paste(unique(subject_information.gender)))
`summarise()` has grouped output by 'workerid', 'subject_information.gender'. You can override using the `.groups` argument.
table(prod_gender_table$subject_gender,prod_gender_table$poli_party)
        
         Democrat Non-Partisan Republican
                1            0          1
  Female       82           25         62
  Male         42           10         46
  Other         4            0          0
prod_data_all <- read.csv("production_data.csv") %>%
  filter(type=="filler_semantic" | type=="filler_grammatical") %>%
  group_by(lexeme,type) %>%
  summarise(lexeme=paste(unique(lexeme)))
`summarise()` has grouped output by 'lexeme'. You can override using the `.groups` argument.
table(prod_data_all$type)

filler_grammatical    filler_semantic 
                20                 30 
prod_data_means <- prod_data %>%
  filter(!is.na(poli_party)) %>%
  filter(poli_party != "Non-Partisan") %>%
  mutate(response_neutral = ifelse(response_gender == "neutral",1,0)) %>%
  filter(gender!="filler" & gender!= "attention" & gender!="") %>%
  group_by(gender,workerid,poli_party,subject_information.gender,subject_information.age,subject_information.education,gender_total) %>%
  summarise(proportion = mean(response_neutral)) 
`summarise()` has grouped output by 'gender', 'workerid', 'poli_party', 'subject_information.gender', 'subject_information.age', 'subject_information.education'. You can override using the `.groups` argument.
table(prod_data_means$proportion,prod_data_means$poli_party,prod_data_means$gender)
, ,  = female

     
      Democrat Republican
  0          2          7
  0.1       12         10
  0.2       15         24
  0.3       26         25
  0.4       17         30
  0.5       29          8
  0.6       12          2
  0.7       11          3
  0.8        5          0

, ,  = male

     
      Democrat Republican
  0          7         14
  0.1       23         36
  0.2       27         26
  0.3       17         16
  0.4       19         12
  0.5       14          5
  0.6       12          0
  0.7        6          0
  0.8        4          0
production_model_two <- lmer(proportion~poli_party*gender + (1|workerid) + (1|subject_information.age) + (1|subject_information.gender), data=prod_data_means)
summary(production_model_two)
Linear mixed model fit by REML. t-tests use Satterthwaite's method ['lmerModLmerTest']
Formula: proportion ~ poli_party * gender + (1 | workerid) + (1 | subject_information.age) +  
    (1 | subject_information.gender)
   Data: prod_data_means

REML criterion at convergence: -311.1

Scaled residuals: 
     Min       1Q   Median       3Q      Max 
-2.19989 -0.61477 -0.00973  0.59707  2.23551 

Random effects:
 Groups                     Name        Variance  Std.Dev.
 workerid                   (Intercept) 0.0101117 0.10056 
 subject_information.age    (Intercept) 0.0016933 0.04115 
 subject_information.gender (Intercept) 0.0006769 0.02602 
 Residual                               0.0197075 0.14038 
Number of obs: 472, groups:  workerid, 236; subject_information.age, 28; subject_information.gender, 3

Fixed effects:
                                 Estimate Std. Error        df t value Pr(>|t|)    
(Intercept)                       0.40370    0.02517   2.65099  16.039  0.00103 ** 
poli_partyRepublican             -0.09572    0.02313 407.95877  -4.139 4.24e-05 ***
gendermale                       -0.07734    0.01755 233.99985  -4.408 1.59e-05 ***
poli_partyRepublican:gendermale  -0.03284    0.02594 233.99985  -1.266  0.20675    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
            (Intr) pl_prR gndrml
pl_prtyRpbl -0.397              
gendermale  -0.349  0.379       
pl_prtyRpb:  0.236 -0.561 -0.676
prod_data_means_male <- prod_data %>%
  filter(!is.na(poli_party)) %>%
  filter(poli_party != "Non-Partisan") %>%
  mutate(response_neutral = ifelse(response_gender == "neutral",1,0)) %>%
  filter(gender!="filler" & gender!= "attention" & gender!="" & gender!="female") %>%
  group_by(workerid,poli_party,subject_information.gender,subject_information.age,subject_information.education) %>%
  summarise(proportion = mean(response_neutral)) 
`summarise()` has grouped output by 'workerid', 'poli_party', 'subject_information.gender', 'subject_information.age'. You can override using the `.groups` argument.
production_model_three <- lmer(proportion~poli_party +(1|subject_information.age) + (1|subject_information.gender), data=prod_data_means_male)
summary(production_model_three)
Linear mixed model fit by REML. t-tests use Satterthwaite's method ['lmerModLmerTest']
Formula: proportion ~ poli_party + (1 | subject_information.age) + (1 |      subject_information.gender)
   Data: prod_data_means_male

REML criterion at convergence: -139

Scaled residuals: 
     Min       1Q   Median       3Q      Max 
-2.17714 -0.72167 -0.04505  0.65158  2.52308 

Random effects:
 Groups                     Name        Variance Std.Dev.
 subject_information.age    (Intercept) 0.002981 0.05460 
 subject_information.gender (Intercept) 0.001186 0.03443 
 Residual                               0.028970 0.17020 
Number of obs: 236, groups:  subject_information.age, 28; subject_information.gender, 3

Fixed effects:
                      Estimate Std. Error        df t value Pr(>|t|)    
(Intercept)            0.32367    0.03034   2.12804  10.670  0.00697 ** 
poli_partyRepublican  -0.12832    0.02313 230.59583  -5.547 7.94e-08 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
            (Intr)
pl_prtyRpbl -0.317
prod_data_means_female <- prod_data %>%
  filter(!is.na(poli_party)) %>%
  filter(poli_party != "Non-Partisan") %>%
  mutate(response_neutral = ifelse(response_gender == "neutral",1,0)) %>%
  filter(gender!="filler" & gender!= "attention" & gender!="" & gender!="male") %>%
  group_by(workerid,poli_party,subject_information.gender,subject_information.age,subject_information.education) %>%
  summarise(proportion = mean(response_neutral)) 
`summarise()` has grouped output by 'workerid', 'poli_party', 'subject_information.gender', 'subject_information.age'. You can override using the `.groups` argument.
production_model_four <- lmer(proportion~poli_party +(1|subject_information.age) + (1|subject_information.gender), data=prod_data_means_female)
summary(production_model_four)
Linear mixed model fit by REML. t-tests use Satterthwaite's method ['lmerModLmerTest']
Formula: proportion ~ poli_party + (1 | subject_information.age) + (1 |      subject_information.gender)
   Data: prod_data_means_female

REML criterion at convergence: -140.1

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-2.3366 -0.6389  0.1072  0.5433  2.4808 

Random effects:
 Groups                     Name        Variance  Std.Dev.
 subject_information.age    (Intercept) 1.607e-03 0.040086
 subject_information.gender (Intercept) 9.383e-05 0.009687
 Residual                               2.970e-02 0.172325
Number of obs: 236, groups:  subject_information.age, 28; subject_information.gender, 3

Fixed effects:
                      Estimate Std. Error        df t value Pr(>|t|)    
(Intercept)            0.40530    0.01919   3.62572  21.117 6.29e-05 ***
poli_partyRepublican  -0.09768    0.02314 233.53487  -4.222 3.47e-05 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
            (Intr)
pl_prtyRpbl -0.531
prod_data_means_all <- prod_data %>%
  filter(!is.na(poli_party)) %>%
  mutate(response_neutral = ifelse(response_gender == "neutral",1,0)) %>%
  filter(gender!="filler" & gender!= "attention" & gender!="") %>%
  group_by(gender,workerid,poli_party,subject_information.gender,subject_information.age,subject_information.education,gender_total) %>%
  summarise(proportion = mean(response_neutral)) 
`summarise()` has grouped output by 'gender', 'workerid', 'poli_party', 'subject_information.gender', 'subject_information.age', 'subject_information.education'. You can override using the `.groups` argument.
prod_data %>%
  filter(!is.na(poli_party)) %>%
  mutate(response_neutral = ifelse(response_gender == "neutral",1,0)) %>%
  filter(gender!="filler" & gender!= "attention" & gender!="") %>%
  group_by(gender,workerid,poli_party,subject_information.gender) %>%
  summarise(proportion = mean(response_neutral)) %>%
  ggplot(aes(x=proportion, fill=poli_party)) +
  geom_histogram() + 
  scale_fill_manual(values=bran_palette) + 
  facet_grid(poli_party~gender) + 
  theme(legend.position = "none") + 
  labs(x="Proportion of Responses", y="Number of Participants",title="Proportions of Neutral Responses by Stimuli Gender", fill="Political Party") + 
  theme(text=element_text(size=16)) + 
  theme(axis.text.x = element_text(angle=20)) +
  theme_grey()
`summarise()` has grouped output by 'gender', 'workerid', 'poli_party'. You can override using the `.groups` argument.
`stat_bin()` using `bins = 30`. Pick better value with `binwidth`.

#%+ #  stat_compare_means(comparisons = my_comparisons, label = "p.signif")
prod_data %>%
  filter(!is.na(poli_party)) %>%
  filter(poli_party != "Non-Partisan") %>%
  mutate(response_neutral = ifelse(response_gender == "neutral",1,0)) %>%
  filter(gender!="filler" & gender!= "attention" & gender!="") %>%
  filter(lexeme=="flight attendant") %>%
  group_by(gender,workerid,poli_party,subject_information.gender) %>%
  summarise(proportion = mean(response_neutral)) %>%
  ggplot(aes(x=gender, y=proportion, fill=gender)) +
  geom_boxplot(varwidth = T) + 
  geom_jitter(alpha=0.1) + 
  scale_fill_manual(values=bran_palette) + 
  facet_wrap(~poli_party) + 
  theme(legend.position = "none") + 
  labs(x="Stimuli Gender", y="Proportion",title="Mean Prop. of Neutral Responses by Stimuli Gender") + 
  theme(text=element_text(size=16)) + 
  theme(axis.text.x = element_text(angle=20)) 
`summarise()` has grouped output by 'gender', 'workerid', 'poli_party'. You can override using the `.groups` argument.

prod_data_means_rep <- prod_data_means %>%
  filter(poli_party == "Republican")
production_model_five <- lmer(proportion~gender_total + (1|subject_information.age), data=prod_data_means_rep)
summary(production_model_five)
Linear mixed model fit by REML. t-tests use Satterthwaite's method ['lmerModLmerTest']
Formula: proportion ~ gender_total + (1 | subject_information.age)
   Data: prod_data_means_rep

REML criterion at convergence: -176.3

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-1.6955 -0.9045 -0.1941  0.8435  2.9019 

Random effects:
 Groups                  Name        Variance  Std.Dev.
 subject_information.age (Intercept) 0.0006875 0.02622 
 Residual                            0.0232941 0.15262 
Number of obs: 216, groups:  subject_information.age, 24

Fixed effects:
               Estimate Std. Error         df t value Pr(>|t|)    
(Intercept)   2.603e-01  2.435e-02  8.419e+01  10.690   <2e-16 ***
gender_total -2.647e-04  6.927e-04  1.983e+02  -0.382    0.703    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
            (Intr)
gender_totl -0.856
prod_data_means_dem <- prod_data_means %>%
  filter(poli_party == "Democrat")
production_model_five <- lmer(proportion~gender_total + (1|workerid), data=prod_data_means_dem)
summary(production_model_five)
Linear mixed model fit by REML. t-tests use Satterthwaite's method ['lmerModLmerTest']
Formula: proportion ~ gender_total + (1 | workerid)
   Data: prod_data_means_dem

REML criterion at convergence: -122.3

Scaled residuals: 
     Min       1Q   Median       3Q      Max 
-2.07915 -0.59145  0.03162  0.59555  2.71479 

Random effects:
 Groups   Name        Variance Std.Dev.
 workerid (Intercept) 0.01298  0.1140  
 Residual             0.02357  0.1535  
Number of obs: 258, groups:  workerid, 129

Fixed effects:
               Estimate Std. Error         df t value Pr(>|t|)    
(Intercept)    0.448326   0.020841 127.000000  21.511  < 2e-16 ***
gender_total  -0.005513   0.001031 127.000000  -5.345 4.06e-07 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
            (Intr)
gender_totl -0.747
prod_data %>%
  filter(!is.na(poli_party)) %>%
  filter(morph_type == "compound") %>%
  mutate(response_neutral = ifelse(response_gender == "neutral",1,0)) %>%
  filter(gender!="filler" & gender!= "attention" & gender!="") %>%
  group_by(gender,lexeme,poli_party,subject_information.gender) %>%
  summarise(proportion = mean(response_neutral)) %>%
  ggplot(aes(x=gender, y=proportion)) +
  geom_boxplot(varwidth=T) + 
  scale_fill_manual(values=bran_palette) + 
#  facet_wrap(~lexeme) + 
  theme(legend.position = "none") + 
  labs(x="Proportion of Responses", y="Number of Participants",title="Proportions of Neutral Responses by Stimuli Gender", fill="Political Party") + 
  theme(text=element_text(size=16)) + 
  theme(axis.text.x = element_text(angle=20)) +
  theme_grey() + 
  stat_compare_means()
`summarise()` has grouped output by 'gender', 'lexeme', 'poli_party'. You can override using the `.groups` argument.

prod_data %>%
  filter(!is.na(poli_party)) %>%
  filter(lexeme == "flight attendant") %>%
  mutate(response_neutral = ifelse(response_gender == "neutral",1,0)) %>%
  filter(gender!="filler" & gender!= "attention" & gender!="") %>%
  group_by(gender) %>%
  summarize(average_flight = mean(response_neutral)) %>%
  ggplot(aes(x=gender, y=average_flight)) +
  geom_bar(stat="identity") + 
  scale_fill_manual(values=bran_palette) + 
  theme(legend.position = "none") + 
  labs(x="Proportion of Responses", y="Number of Participants",title="Proportions of Neutral Responses by Stimuli Gender", fill="Political Party") + 
  theme(text=element_text(size=16)) + 
  theme(axis.text.x = element_text(angle=20)) +
  theme_grey() + 
  stat_compare_means()

prod_data %>%
  filter(!is.na(poli_party)) %>%
  #filter(poli_party != "Non-Partisan") %>%
  group_by(poli_party) %>%
  summarize(mean_ideo = mean(gender_total), CI.Low = ci.low(gender_total), CI.High = ci.high(gender_total)) %>%
  mutate(YMin = mean_ideo - CI.Low, YMax = mean_ideo + CI.High) %>%
  ggplot(aes(x=poli_party,y=mean_ideo,fill=poli_party)) + 
  geom_bar(stat='identity') + 
  #geom_point(data=prod_data, aes(x=poli_party,y=gender_total),alpha=0.15, position="jitter") + 
  geom_errorbar(aes(ymin=YMin,ymax=YMax),width=.25) + 
  theme_bw() + 
  labs(x="Participant Political Party", y="Mean Gender Ideology") + 
  theme(text=element_text(size=16)) + 
  theme(axis.text.x = element_text(angle=5, vjust = .7)) + 
  scale_fill_manual(values = bran_palette) +
  theme(legend.position = "none")

ggsave("prod_ideology_party.png", width=7, height=5,path='/Users/branpap/Desktop/gender_processing/talks_and_papers/qp_paper/figures')
prod_data %>%
  group_by(workerid,poli_party,gender_total) %>%
  ggplot(aes(x=poli_party, y=gender_total)) + 
  geom_boxplot()

final_dat_flight <- final_dat %>%
  filter(lexeme=="flight attendant")
production_model_flight <- lmer(neutrality_binary~gender + (1|name), data=final_dat_flight)
summary(production_model_flight)
Linear mixed model fit by REML. t-tests use Satterthwaite's method ['lmerModLmerTest']
Formula: neutrality_binary ~ gender + (1 | name)
   Data: final_dat_flight

REML criterion at convergence: 347.9

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-1.7447 -1.3874  0.5320  0.7019  0.8447 

Random effects:
 Groups   Name        Variance Std.Dev.
 name     (Intercept) 0.002587 0.05086 
 Residual             0.200701 0.44800 
Number of obs: 274, groups:  name, 24

Fixed effects:
            Estimate Std. Error       df t value Pr(>|t|)    
(Intercept)  0.67242    0.04182 24.68150  16.079 1.39e-14 ***
gendermale   0.08431    0.05833 24.21875   1.445    0.161    
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
           (Intr)
gendermale -0.717
prod_data_means_all %>%
  filter(!is.na(poli_party)) %>%
  #filter(poli_party != "Non-Partisan") %>%
  group_by(gender,poli_party) %>%
  summarize(mean_prop = mean(proportion), CI.Low = ci.low(proportion), CI.High = ci.high(proportion)) %>%
  mutate(YMin = mean_prop - CI.Low, YMax = mean_prop + CI.High) %>%
  ggplot(aes(x=poli_party,y=mean_prop,fill=poli_party)) + 
  geom_bar(stat='identity') + 
  geom_point(data=prod_data_means_all, aes(x=poli_party,y=proportion),alpha=0.15, position="jitter") + 
  geom_errorbar(aes(ymin=YMin,ymax=YMax),width=.25) + 
  facet_wrap(~ gender) + 
  theme_bw() + 
  labs(x="Participant Political Party", y="Mean Proportion of Neutral Responses",title="Neutral Responses by Stimuli Gender") + 
  theme(text=element_text(size=16)) + 
  theme(axis.text.x = element_text(angle=5, vjust = .7)) + 
  scale_fill_manual(values = bran_palette) +
  theme(legend.position = "none")
`summarise()` has grouped output by 'gender'. You can override using the `.groups` argument.

ggsave("prod_neutral_poli_bar_gender.png", width=7, height=5,path='/Users/branpap/Desktop/gender_processing/talks_and_papers/qp_paper/figures')
prod_data %>%
  filter(!is.na(poli_party)) %>%
  filter(morph_type == "compound") %>%
  mutate(response_neutral = ifelse(response_gender == "neutral",1,0)) %>%
  filter(gender!="filler" & gender!= "attention" & gender!="") %>%
  #filter(poli_party != "Non-Partisan") %>%
  group_by(gender,poli_party) %>%
  summarize(mean_prop = mean(response_neutral), CI.Low = ci.low(response_neutral), CI.High = ci.high(response_neutral)) %>%
  mutate(YMin = mean_prop - CI.Low, YMax = mean_prop + CI.High) %>%
  ggplot(aes(x=poli_party,y=mean_prop,fill=poli_party)) + 
  geom_bar(stat='identity') + 
  geom_point(data=prod_data_means_all, aes(x=poli_party,y=proportion),alpha=0.15, position="jitter") + 
  geom_errorbar(aes(ymin=YMin,ymax=YMax),width=.25) + 
  facet_wrap(~ gender) + 
  theme_bw() + 
  labs(x="Participant Political Party", y="Mean Proportion of Neutral Responses",title="Neutral Responses by Stimuli Gender") + 
  theme(text=element_text(size=16)) + 
  theme(axis.text.x = element_text(angle=5, vjust = .7)) + 
  scale_fill_manual(values = bran_palette) +
  theme(legend.position = "none")
`summarise()` has grouped output by 'gender'. You can override using the `.groups` argument.

ggsave("prod_neutral_poli_bar_nonmean.png", width=7, height=5,path='/Users/branpap/Desktop/gender_processing/talks_and_papers/qp_paper/figures')
prod_data_binary_party <- prod_data %>%
  filter(poli_party == "Democrat" | poli_party == "Republican") %>%
  mutate(response_neutral = ifelse(response_gender == "neutral",1,0)) %>%
  filter(gender!="filler" & gender!= "attention" & gender!="")
prod_neutral_poli_nomean_model <- lmer(response_neutral~poli_party + gender + (1|lexeme) + (1|name) + (1|workerid),data=prod_data_binary_party)
summary(prod_neutral_poli_nomean_model)
Linear mixed model fit by REML. t-tests use Satterthwaite's method ['lmerModLmerTest']
Formula: response_neutral ~ poli_party + gender + (1 | lexeme) + (1 |      name) + (1 | workerid)
   Data: prod_data_binary_party

REML criterion at convergence: 3520.9

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-2.6507 -0.7013 -0.1179  0.8024  2.8674 

Random effects:
 Groups   Name        Variance  Std.Dev.
 workerid (Intercept) 0.0333563 0.18264 
 name     (Intercept) 0.0003246 0.01802 
 lexeme   (Intercept) 0.0579523 0.24073 
 Residual             0.1485382 0.38541 
Number of obs: 3332, groups:  workerid, 238; name, 24; lexeme, 14

Fixed effects:
                      Estimate Std. Error        df t value Pr(>|t|)    
(Intercept)            0.58062    0.06747  15.37391   8.606 2.88e-07 ***
poli_partyRepublican  -0.17023    0.02728 235.99030  -6.240 2.01e-09 ***
gendermale            -0.11952    0.01537  21.61134  -7.776 1.06e-07 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
            (Intr) pl_prR
pl_prtyRpbl -0.185       
gendermale  -0.113 -0.002
prod_data %>%
  filter(!is.na(poli_party)) %>%
  filter(morph_type == "compound") %>%
  mutate(response_neutral = ifelse(response_gender == "neutral",1,0)) %>%
  filter(gender!="filler" & gender!= "attention" & gender!="") %>%
  #filter(poli_party != "Non-Partisan") %>%
  group_by(gender,poli_party) %>%
  summarize(mean_prop = mean(response_neutral), CI.Low = ci.low(response_neutral), CI.High = ci.high(response_neutral)) %>%
  mutate(YMin = mean_prop - CI.Low, YMax = mean_prop + CI.High) %>%
  ggplot(aes(x=gender,y=mean_prop,fill=gender)) + 
  geom_bar(stat='identity') + 
  geom_point(data=prod_data_means_all, aes(x=gender,y=proportion),alpha=0.15, position="jitter") + 
  geom_errorbar(aes(ymin=YMin,ymax=YMax),width=.25) + 
  facet_wrap(~ poli_party) + 
  theme_bw() + 
  labs(x="Stimulus Gender", y="Mean Proportion of Neutral Responses",title="Neutral Responses by Stimuli Gender") + 
  theme(text=element_text(size=16)) + 
  theme(axis.text.x = element_text(angle=5, vjust = .7)) + 
  scale_fill_manual(values = bran_palette) +
  theme(legend.position = "none")
`summarise()` has grouped output by 'gender'. You can override using the `.groups` argument.

ggsave("prod_neutral_gender_bar_nonmean.png", width=7, height=5,path='/Users/branpap/Desktop/gender_processing/talks_and_papers/qp_paper/figures')
prod_data_means_all %>%
  filter(!is.na(poli_party)) %>%
  #filter(poli_party != "Non-Partisan") %>%
  group_by(gender,poli_party) %>%
  summarize(mean_prop = mean(proportion), CI.Low = ci.low(proportion), CI.High = ci.high(proportion)) %>%
  mutate(YMin = mean_prop - CI.Low, YMax = mean_prop + CI.High) %>%
  ggplot(aes(x=gender,y=mean_prop,fill=gender)) + 
  geom_bar(stat='identity') + 
  geom_point(data=prod_data_means_all, aes(x=gender,y=proportion),alpha=0.15, position="jitter") + 
  geom_errorbar(aes(ymin=YMin,ymax=YMax),width=.25) + 
  facet_wrap(~ poli_party) + 
  theme_bw() + 
  labs(x="Gender Seen", y="Mean Proportion of Neutral Responses",title="Neutral Responses by Stimuli Gender") + 
  theme(text=element_text(size=16)) + 
  theme(axis.text.x = element_text(angle=5, vjust = .7)) + 
  scale_fill_manual(values = bran_palette) +
  theme(legend.position = "none")
`summarise()` has grouped output by 'gender'. You can override using the `.groups` argument.

ggsave("prod_neutral_gender_bar.png", width=7, height=5,path='/Users/branpap/Desktop/gender_processing/talks_and_papers/qp_paper/figures')
prod_data %>%
  filter(!is.na(poli_party)) %>%
  filter(morph_type == "compound") %>%
  mutate(response_neutral = ifelse(response_gender == "neutral" | response_gender == "male/neutral",1,0)) %>%
  filter(gender!="filler" & gender!= "attention" & gender!="") %>%
  group_by(gender,lexeme,poli_party,subject_information.gender) %>%
  summarise(proportion = mean(response_neutral)) %>%
  group_by(gender,lexeme) %>%
  summarize(mean_prop = mean(proportion), CI.Low = ci.low(proportion), CI.High = ci.high(proportion)) %>%
  mutate(YMin = mean_prop - CI.Low, YMax = mean_prop + CI.High) %>%
  ggplot(aes(x=gender,y=mean_prop,fill=gender)) + 
  geom_bar(stat='identity') + 
  geom_errorbar(aes(ymin=YMin,ymax=YMax),width=.25) + 
  facet_wrap(~lexeme) + 
  theme(legend.position = "none") + 
  labs(x="Participant Political Party", y="Mean Proportion of Gender-Neutral Responses",title="Proportions of Neutral Responses by Stimuli Gender", fill="Political Party") + 
  theme(text=element_text(size=16)) + 
  theme(axis.text.x = element_text(angle=20)) +
  theme_grey() 
`summarise()` has grouped output by 'gender', 'lexeme', 'poli_party'. You can override using the `.groups` argument.
`summarise()` has grouped output by 'gender'. You can override using the `.groups` argument.

ggsave("prod_neutral_morph_bar.png", width=7, height=5,path='/Users/branpap/Desktop/gender_processing/talks_and_papers/qp_paper/figures')
prod_data_means_all <- prod_data %>%
  filter(!is.na(poli_party)) %>%
  mutate(response_neutral = ifelse(response_gender == "neutral",1,0)) %>%
  filter(gender!="filler" & gender!= "attention" & gender!="") %>%
  group_by(gender,workerid,poli_party,subject_information.gender,subject_information.age,subject_information.education,gender_total) %>%
  summarise(proportion = mean(response_neutral)) 
`summarise()` has grouped output by 'gender', 'workerid', 'poli_party', 'subject_information.gender', 'subject_information.age', 'subject_information.education'. You can override using the `.groups` argument.
LS0tCnRpdGxlOiAiUHJvZHVjdGlvbiBPbmx5IgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCgpgYGB7cn0KbGlicmFyeSh0aWR5dmVyc2UpCmxpYnJhcnkobG1lNCkKbGlicmFyeShnZ3B1YnIpCgpzb3VyY2UoImhlbHBlcnMuUiIpCmBgYAoKYGBge3J9CmJyYW5fcGFsZXR0ZSA9IGMoIiM3YWU3ZTUiLCIjQjJBNkRFIiwgIiNmZTVmNTUiLCAiIzE0MzQyYiIsICIjNjkzODVjIikKCnRoZW1lX3NldCh0aGVtZV9taW5pbWFsKCkpCmBgYAoKYGBge3J9CmxleF9mcmVxcyA8LSByZWFkLmNzdigiZnJlcV9wcmVwZWQuY3N2IikgJT4lCiAgbXV0YXRlKGxlZnRfc3VycHJpc2FsID0gKC1sb2cobWVhbl9sZWZ0X25ldXRyYWwpKS8oLWxvZyhtZWFuX2xlZnRfZ2VuZGVyZWQpKSkgJT4lCiAgbXV0YXRlKHJpZ2h0X3N1cnByaXNhbCA9ICgtbG9nKG1lYW5fcmlnaHRfbmV1dHJhbCkpLygtbG9nKG1lYW5fcmlnaHRfZ2VuZGVyZWQpKSkKYGBgCgpgYGB7cn0KZ2VuZGVyX3RyYW5zY2VuZGVuY2VfY29scyA8LSBjKCdzdWJqZWN0X2luZm9ybWF0aW9uLmdlbmRlcl9xMScsJ3N1YmplY3RfaW5mb3JtYXRpb24uZ2VuZGVyX3EyJywnc3ViamVjdF9pbmZvcm1hdGlvbi5nZW5kZXJfcTMnLCdzdWJqZWN0X2luZm9ybWF0aW9uLmdlbmRlcl9xNCcsJ3N1YmplY3RfaW5mb3JtYXRpb24uZ2VuZGVyX3E1JykKCmdlbmRlcl9saW5rZWRfY29scyA8LSBjKCdzdWJqZWN0X2luZm9ybWF0aW9uLmdlbmRlcl9xNicsJ3N1YmplY3RfaW5mb3JtYXRpb24uZ2VuZGVyX3E3Jywnc3ViamVjdF9pbmZvcm1hdGlvbi5nZW5kZXJfcTgnLCdzdWJqZWN0X2luZm9ybWF0aW9uLmdlbmRlcl9xOScsJ3N1YmplY3RfaW5mb3JtYXRpb24uZ2VuZGVyX3ExMCcsJ3N1YmplY3RfaW5mb3JtYXRpb24uZ2VuZGVyX3ExMScsJ3N1YmplY3RfaW5mb3JtYXRpb24uZ2VuZGVyX3ExMicsJ3N1YmplY3RfaW5mb3JtYXRpb24uZ2VuZGVyX3ExMycpCmBgYAoKIyMgUHJvZHVjdGlvbiBUYXNrIFN0dWR5CgojIyMgTWV0aG9kcwoKIyMjIEFuYWx5c2lzCgoqKkRhdGEgUmVhZC1pbioqCgpgYGB7cn0KcHJvZF9kYXRhIDwtIHJlYWQuY3N2KCJwcm9kdWN0aW9uX2RhdGEuY3N2IikKYGBgCgoqKkV4Y2x1c2lvbnMqKgoKYGBge3J9CnByb2RfZXhjbHVzaW9uIDwtIHByb2RfZGF0YSAlPiUgZmlsdGVyKG5hbWU9PSdhdHRlbnRpb24nKSAlPiUKICBncm91cF9ieSh3b3JrZXJpZCkgJT4lCiAgc3VtbWFyaXNlKGFjY3VyYWN5ID0gbWVhbihjb3JyZWN0KSkgJT4lCiAgbXV0YXRlKGV4Y2x1ZGUgPSBpZmVsc2UoYWNjdXJhY3kgPCAwLjgwLCdZZXMnLCdObycpKSAlPiUKICBmaWx0ZXIoZXhjbHVkZSA9PSAiWWVzIikKYGBgCgpgYGB7cn0KcHJvZF9kYXRhIDwtIHByb2RfZGF0YVshKHByb2RfZGF0YSR3b3JrZXJpZCAlaW4lIHByb2RfZXhjbHVzaW9uJHdvcmtlcmlkKSxdCmBgYAoKKipBZGRpdGlvbmFsIEluZm9ybWF0aW9uKiogCgpgYGB7cn0KcHJvZF9kYXRhIDwtIHByb2RfZGF0YSAlPiUKICBtdXRhdGUoZ2VuZGVyX3RyYW5zID0gMTAwIC0gKHJvd01lYW5zKHByb2RfZGF0YVtnZW5kZXJfdHJhbnNjZW5kZW5jZV9jb2xzXSkpKSAlPiUKICBtdXRhdGUoZ2VuZGVyX2xpbmsgPSByb3dNZWFucyhwcm9kX2RhdGFbZ2VuZGVyX2xpbmtlZF9jb2xzXSkpIAoKZ2VuZGVyX2FsbCA9IGMoJ2dlbmRlcl90cmFucycsJ2dlbmRlcl9saW5rJykKCnByb2RfZGF0YSA8LSBwcm9kX2RhdGEgJT4lCiAgbXV0YXRlKGdlbmRlcl90b3RhbCA9IHJvd01lYW5zKHByb2RfZGF0YVtnZW5kZXJfYWxsXSkpCmBgYCAKCmBgYHtyfQpwcm9kX2RhdGEgPC0gcHJvZF9kYXRhICU+JQogIGZpbHRlcih0eXBlID09ICJjcml0aWNhbCIpICU+JQogIG11dGF0ZShyZXNwb25zZV9nZW5kZXIgPSBpZmVsc2UocmVzcG9uc2UgPT0gImFjdHJlc3MiIHwgcmVzcG9uc2UgPT0gImFuY2hvcndvbWFuIiB8IHJlc3BvbnNlID09ICJzdGV3YXJkZXNzIiB8IHJlc3BvbnNlID09ICJidXNpbmVzc3dvbWFuIiB8IHJlc3BvbnNlID09ICdjYW1lcmF3b21hbicgfCByZXNwb25zZSA9PSAnY29uZ3Jlc3N3b21hbicgfCByZXNwb25zZSA9PSAnY3JhZnRzd29tYW4nIHwgcmVzcG9uc2UgPT0gJ2NyZXd3b21hbicgfCByZXNwb25zZSA9PSAnZmlyZXdvbWFuJyB8IHJlc3BvbnNlID09ICdmb3Jld29tYW4nICB8IHJlc3BvbnNlID09ICdoZWlyZXNzJyB8IHJlc3BvbnNlID09ICdoZXJvaW5lJyB8IHJlc3BvbnNlID09ICdob3N0ZXNzJyB8IHJlc3BvbnNlID09ICdodW50cmVzcycgfCByZXNwb25zZSA9PSAnbGF5d29tYW4nIHwgcmVzcG9uc2UgPT0gJ3BvbGljZXdvbWFuJyB8IHJlc3BvbnNlID09ICdzYWxlc3dvbWFuJyB8IHJlc3BvbnNlID09ICdzdHVudHdvbWFuJyB8IHJlc3BvbnNlID09ICd2aWxsYWluZXNzJyB8IHJlc3BvbnNlID09ICd3ZWF0aGVyd29tYW4nLCJmZW1hbGUiLGlmZWxzZShyZXNwb25zZSA9PSAiYW5jaG9yIiB8IHJlc3BvbnNlID09ICJmbGlnaHQgYXR0ZW5kYW50IiB8IHJlc3BvbnNlID09ICJidXNpbmVzc3BlcnNvbiIgfCByZXNwb25zZSA9PSAnY2FtZXJhIG9wZXJhdG9yJyB8IHJlc3BvbnNlID09ICdjb25ncmVzc3BlcnNvbicgfCByZXNwb25zZSA9PSAnY3JhZnRzcGVyc29uJyB8IHJlc3BvbnNlID09ICdjcmV3bWVtYmVyJyB8IHJlc3BvbnNlID09ICdmaXJlZmlnaHRlcicgfCByZXNwb25zZSA9PSAnZm9yZXBlcnNvbicgfCByZXNwb25zZSA9PSAnbGF5cGVyc29uJyB8IHJlc3BvbnNlID09ICdwb2xpY2Ugb2ZmaWNlcicgfCByZXNwb25zZSA9PSAnc2FsZXNwZXJzb24nIHwgcmVzcG9uc2UgPT0gJ3N0dW50IGRvdWJsZScgfCByZXNwb25zZSA9PSAnbWV0ZW9yb2xvZ2lzdCcsIm5ldXRyYWwiLGlmZWxzZShyZXNwb25zZSA9PSAiYW5jaG9ybWFuIiB8IHJlc3BvbnNlID09ICJzdGV3YXJkIiB8IHJlc3BvbnNlID09ICJidXNpbmVzc21hbiIgfCByZXNwb25zZSA9PSAnY2FtZXJhbWFuJyB8IHJlc3BvbnNlID09ICdjb25ncmVzc21hbicgfCByZXNwb25zZSA9PSAnY3JhZnRzbWFuJyB8IHJlc3BvbnNlID09ICdjcmV3bWFuJyB8IHJlc3BvbnNlID09ICdmaXJlbWFuJyB8IHJlc3BvbnNlID09ICdmb3JlbWFuJyB8IHJlc3BvbnNlID09ICdsYXltYW4nIHwgcmVzcG9uc2UgPT0gJ3BvbGljZW1hbicgfCByZXNwb25zZSA9PSAnc2FsZXNtYW4nIHwgcmVzcG9uc2UgPT0gJ3N0dW50bWFuJyB8IHJlc3BvbnNlID09ICd3ZWF0aGVybWFuJywibWFsZSIsJ21hbGUvbmV1dHJhbCcpKSkpICU+JQogIG11dGF0ZShjb25ncnVlbmN5ID0gaWZlbHNlKGdlbmRlciA9PSByZXNwb25zZV9nZW5kZXIsInRydWUiLCJmYWxzZSIpKSAlPiUKICBtdXRhdGUobmV1dHJhbGl0eSA9IGlmZWxzZShyZXNwb25zZV9nZW5kZXIgPT0gIm5ldXRyYWwiLCJ0cnVlIiwiZmFsc2UiKSklPiUKICBtdXRhdGUobW9ycGhfdHlwZSA9IGlmZWxzZShsZXhlbWUhPSAnYWN0b3InICYgbGV4ZW1lIT0gJ2hvc3QnICYgbGV4ZW1lICE9J2h1bnRlcicgJiBsZXhlbWUhPSAndmlsbGFpbicgJiBsZXhlbWUhPSAnaGVpcicgJiBsZXhlbWUhPSAnaGVybycsJ2NvbXBvdW5kJywnYWRvcHRpb24nKSkgJT4lCiAgbXV0YXRlKHBvbGlfcGFydHkgPSBpZmVsc2Uoc3ViamVjdF9pbmZvcm1hdGlvbi5wYXJ0eV9hbGlnbm1lbnQgPT0gMSB8IHN1YmplY3RfaW5mb3JtYXRpb24ucGFydHlfYWxpZ25tZW50ID09IDIsJ1JlcHVibGljYW4nLGlmZWxzZShzdWJqZWN0X2luZm9ybWF0aW9uLnBhcnR5X2FsaWdubWVudCA9PSA0IHwgc3ViamVjdF9pbmZvcm1hdGlvbi5wYXJ0eV9hbGlnbm1lbnQgPT0gNSwnRGVtb2NyYXQnLCdOb24tUGFydGlzYW4nKSkpCmBgYAoKKipSZXNwb25zZXMgYnkgUG9saXRpY2FsIElkZW9sb2d5KioKCmBgYHtyfQpwcm9kX2RhdGEgJT4lIAogIGZpbHRlcighaXMubmEocG9saV9wYXJ0eSkpICU+JQogIGZpbHRlcihtb3JwaF90eXBlID09ImNvbXBvdW5kIikgJT4lCiAgZ2dwbG90KGFlcyh4PXBvbGlfcGFydHksIGZpbGw9cmVzcG9uc2VfZ2VuZGVyKSkgKyAKICBnZW9tX2Jhcihwb3NpdGlvbj0iZmlsbCIpICsgCiAgZmFjZXRfd3JhcCh+Z2VuZGVyKSArIAogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGJyYW5fcGFsZXR0ZSkgKyAKICBsYWJzKHg9IlBhcnRpY2lwYW50IFBvbGl0aWNhbCBQYXJ0eSIsIGZpbGw9IkdlbmRlciBvZiBSZXNwb25zZSIsIHk9IlByb3BvcnRpb24gb2YgUmVzcG9uc2VzIiwgdGl0bGU9IkdlbmRlciBvZiBSZXNwb25zZSBieSBHZW5kZXIgb2YgU3RpbXVsdXMgTmFtZSIpICsgCiAgdGhlbWUodGV4dD1lbGVtZW50X3RleHQoc2l6ZT0xNSkpICsgCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGU9MjUpKQpgYGAKCmBgYHtyfQpnZ3NhdmUoInByb2RfYWxsX3BvbGkucG5nIiwgd2lkdGg9NyxoZWlnaHQ9NSxwYXRoPScvVXNlcnMvYnJhbnBhcC9EZXNrdG9wL2dlbmRlcl9wcm9jZXNzaW5nL3RhbGtzX2FuZF9wYXBlcnMvcXBfcGFwZXIvZmlndXJlcycpCmBgYCAKCgoKCmBgYHtyfQpwcm9kX2RhdGEgJT4lIAogIGZpbHRlcighaXMubmEoc3ViamVjdF9pbmZvcm1hdGlvbi5wYXJ0eV9hbGlnbm1lbnQpKSAlPiUKICBmaWx0ZXIobW9ycGhfdHlwZSA9PSJjb21wb3VuZCIpICU+JQogIGdncGxvdChhZXMoeD1zdWJqZWN0X2luZm9ybWF0aW9uLnBhcnR5X2FsaWdubWVudCwgZmlsbD1yZXNwb25zZV9nZW5kZXIpKSArIAogIGdlb21fYmFyKHBvc2l0aW9uPSJmaWxsIikgKyAKICBmYWNldF93cmFwKH5nZW5kZXIpICsgCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYnJhbl9wYWxldHRlKSArIAogIGxhYnMoeD0iUGFydGljaXBhbnQgUG9saXRpY2FsIFBhcnR5IiwgZmlsbD0iR2VuZGVyIG9mIFJlc3BvbnNlIiwgeT0iUHJvcG9ydGlvbiBvZiBSZXNwb25zZXMiLCB0aXRsZT0iR2VuZGVyIG9mIFJlc3BvbnNlIGJ5IEdlbmRlciBvZiBTdGltdWx1cyBOYW1lIikKYGBgCgoqKkdlbmRlciBvZiBSZXNwb25zZSBieSBQb2xpdGljYWwgQWxpZ25tZW50IGFuZCBHZW5kZXIgSWRlb2xvZ3kqKgoKYGBge3J9CnByb2RfZGF0YSAlPiUKICBmaWx0ZXIoIWlzLm5hKHBvbGlfcGFydHkpKSAlPiUKICBtdXRhdGUocmVzcG9uc2VfbmV1dHJhbCA9IGlmZWxzZShyZXNwb25zZV9nZW5kZXIgPT0gIm5ldXRyYWwiLDEsMCkpICU+JQogIGZpbHRlcihnZW5kZXIhPSJmaWxsZXIiICYgZ2VuZGVyIT0gImF0dGVudGlvbiIgJiBnZW5kZXIhPSIiICYgbW9ycGhfdHlwZT09ImNvbXBvdW5kIikgJT4lCiAgZ3JvdXBfYnkoZ2VuZGVyLGdlbmRlcl90b3RhbCxwb2xpX3BhcnR5KSAlPiUKICBzdW1tYXJpc2UocHJvcG9ydGlvbiA9IG1lYW4ocmVzcG9uc2VfbmV1dHJhbCkpICU+JQogIGdncGxvdChhZXMoeD1nZW5kZXJfdG90YWwsIHk9cHJvcG9ydGlvbiwgY29sb3I9Z2VuZGVyKSkgKwogICAgZ2VvbV9wb2ludCgpICsgCiAgICBnZW9tX3Ntb290aCgpICsgCiAgICBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzID0gYnJhbl9wYWxldHRlKSArCiAgICBmYWNldF93cmFwKH5wb2xpX3BhcnR5KSArIAogICAgbGFicyh4PSJHZW5kZXIgSWRlb2xvZ3kgU2NvcmUiLCB5PSJQcm9wb3J0aW9uIG9mIEdlbmRlciBOZXV0cmFsIFJlc3BvbnNlcyIsY29sb3I9IkdlbmRlciBvZiBOYW1lIFNlZW4iKSArIAogICAgdGhlbWUodGV4dD1lbGVtZW50X3RleHQoc2l6ZT0xNSkpCmBgYAoKYGBge3J9Cmdnc2F2ZSgicHJvZF9uZXV0cmFsX3BvbGkucG5nIiwgd2lkdGg9MTAsaGVpZ2h0PTUscGF0aD0nL1VzZXJzL2JyYW5wYXAvRGVza3RvcC9nZW5kZXJfcHJvY2Vzc2luZy90YWxrc19hbmRfcGFwZXJzL3FwX3BhcGVyL2ZpZ3VyZXMnKQpgYGAgCgpgYGB7cn0KcHJvZF9kYXRhICU+JQogIGZpbHRlcighaXMubmEocG9saV9wYXJ0eSkpICU+JQogIG11dGF0ZShyZXNwb25zZV9uZXV0cmFsID0gaWZlbHNlKHJlc3BvbnNlX2dlbmRlciA9PSAibmV1dHJhbCIsMSwwKSkgJT4lCiAgZmlsdGVyKGdlbmRlciE9ImZpbGxlciIgJiBnZW5kZXIhPSAiYXR0ZW50aW9uIiAmIGdlbmRlciE9IiIpICU+JQogIGdyb3VwX2J5KGdlbmRlcixzdWJqZWN0X2luZm9ybWF0aW9uLmFnZSxwb2xpX3BhcnR5KSAlPiUKICBzdW1tYXJpc2UocHJvcG9ydGlvbiA9IG1lYW4ocmVzcG9uc2VfbmV1dHJhbCkpICU+JQogIGdncGxvdChhZXMoeD1zdWJqZWN0X2luZm9ybWF0aW9uLmFnZSwgeT1wcm9wb3J0aW9uLCBjb2xvcj1nZW5kZXIpKSArCiAgICBnZW9tX3BvaW50KCkgKyAKICAgIGdlb21fc21vb3RoKCkgKyAKICAgIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXMgPSBicmFuX3BhbGV0dGUpIApgYGAKYGBge3J9Cm15X2NvbXBhcmlzb25zIDwtIGxpc3QoIGMoIkRlbW9jcmF0IiwiUmVwdWJsaWNhbiIpLGMoIkRlbW9jcmF0IiwiTm9uLVBhcnRpc2FuIiksYygiUmVwdWJsaWNhbiIsIk5vbi1QYXJ0aXNhbiIpKQpgYGAKCgpgYGB7cn0KcHJvZF9kYXRhICU+JQogIGZpbHRlcighaXMubmEocG9saV9wYXJ0eSkpICU+JQogIG11dGF0ZShyZXNwb25zZV9uZXV0cmFsID0gaWZlbHNlKHJlc3BvbnNlX2dlbmRlciA9PSAibmV1dHJhbCIsMSwwKSkgJT4lCiAgZmlsdGVyKGdlbmRlciE9ImZpbGxlciIgJiBnZW5kZXIhPSAiYXR0ZW50aW9uIiAmIGdlbmRlciE9IiIpICU+JQogIGZpbHRlcihzdWJqZWN0X2luZm9ybWF0aW9uLmdlbmRlciA9PSAiTWFsZSIgfCBzdWJqZWN0X2luZm9ybWF0aW9uLmdlbmRlciA9PSAiRmVtYWxlIikgJT4lCiAgZmlsdGVyKHBvbGlfcGFydHkgIT0gIk5vbi1QYXJ0aXNhbiIpICU+JQogIGdyb3VwX2J5KGdlbmRlcix3b3JrZXJpZCxwb2xpX3BhcnR5LHN1YmplY3RfaW5mb3JtYXRpb24uZ2VuZGVyKSAlPiUKICBzdW1tYXJpc2UocHJvcG9ydGlvbiA9IG1lYW4ocmVzcG9uc2VfbmV1dHJhbCkpICU+JQogIGdncGxvdChhZXMoeD1wb2xpX3BhcnR5LCB5PXByb3BvcnRpb24sIGZpbGw9cG9saV9wYXJ0eSkpICsKICBnZW9tX2JveHBsb3QodmFyd2lkdGggPSBUKSArIAogIGdlb21faml0dGVyKGFscGhhPTAuMSkgKyAKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9YnJhbl9wYWxldHRlKSArIAogIGZhY2V0X2dyaWQoc3ViamVjdF9pbmZvcm1hdGlvbi5nZW5kZXJ+Z2VuZGVyKSArIAogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKyAKICBsYWJzKHg9IlBhcnRpY2lwYW50IFBvbGl0aWNhbCBQYXJ0eSIsIHk9IlByb3BvcnRpb24iLHRpdGxlPSJNZWFuIFByb3AuIG9mIE5ldXRyYWwgUmVzcG9uc2VzIGJ5IFN0aW11bGkgR2VuZGVyIikgKyAKICB0aGVtZSh0ZXh0PWVsZW1lbnRfdGV4dChzaXplPTE2KSkgKyAKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZT0yMCkpICsgCiAgc3RhdF9jb21wYXJlX21lYW5zKGxhYmVsID0gInAuc2lnbmlmIikKYGBgCgpgYGB7cn0KcHJvZF9kYXRhICU+JQogIGZpbHRlcighaXMubmEocG9saV9wYXJ0eSkpICU+JQogIG11dGF0ZShyZXNwb25zZV9uZXV0cmFsID0gaWZlbHNlKHJlc3BvbnNlX2dlbmRlciA9PSAibmV1dHJhbCIsMSwwKSkgJT4lCiAgZmlsdGVyKGdlbmRlciE9ImZpbGxlciIgJiBnZW5kZXIhPSAiYXR0ZW50aW9uIiAmIGdlbmRlciE9IiIpICU+JQogIGdyb3VwX2J5KGdlbmRlcix3b3JrZXJpZCxwb2xpX3BhcnR5LHN1YmplY3RfaW5mb3JtYXRpb24uZ2VuZGVyKSAlPiUKICBzdW1tYXJpc2UocHJvcG9ydGlvbiA9IG1lYW4ocmVzcG9uc2VfbmV1dHJhbCkpICU+JQogIGdncGxvdChhZXMoeD1wb2xpX3BhcnR5LCB5PXByb3BvcnRpb24sIGZpbGw9cG9saV9wYXJ0eSkpICsKICBnZW9tX2JveHBsb3QodmFyd2lkdGggPSBUKSArIAogIGdlb21faml0dGVyKGFscGhhPTAuMSkgKyAKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9YnJhbl9wYWxldHRlKSArIAogIGZhY2V0X3dyYXAofmdlbmRlcikgKyAKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsgCiAgbGFicyh4PSJQYXJ0aWNpcGFudCBQb2xpdGljYWwgUGFydHkiLCB5PSJQcm9wb3J0aW9uIix0aXRsZT0iTWVhbiBQcm9wLiBvZiBOZXV0cmFsIFJlc3BvbnNlcyBieSBTdGltdWxpIEdlbmRlciIpICsgCiAgdGhlbWUodGV4dD1lbGVtZW50X3RleHQoc2l6ZT0xNikpICsgCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGU9MjApKSAKIyUrICMgIHN0YXRfY29tcGFyZV9tZWFucyhjb21wYXJpc29ucyA9IG15X2NvbXBhcmlzb25zLCBsYWJlbCA9ICJwLnNpZ25pZiIpCmBgYAoKYGBge3J9Cmdnc2F2ZSgicHJvZF9uZXV0cmFsX3BvbGlfYm94LnBuZyIsIHdpZHRoPTcsIGhlaWdodD01LHBhdGg9Jy9Vc2Vycy9icmFucGFwL0Rlc2t0b3AvZ2VuZGVyX3Byb2Nlc3NpbmcvdGFsa3NfYW5kX3BhcGVycy9xcF9wYXBlci9maWd1cmVzJykKYGBgIAoKYGBge3J9CnByb2RfZGF0YSAlPiUKICBmaWx0ZXIoIWlzLm5hKHBvbGlfcGFydHkpKSAlPiUKICBtdXRhdGUocmVzcG9uc2VfbmV1dHJhbCA9IGlmZWxzZShyZXNwb25zZV9nZW5kZXIgPT0gIm5ldXRyYWwiLDEsMCkpICU+JQogIGZpbHRlcihnZW5kZXIhPSJmaWxsZXIiICYgZ2VuZGVyIT0gImF0dGVudGlvbiIgJiBnZW5kZXIhPSIiKSAlPiUKICBncm91cF9ieShnZW5kZXIscG9saV9wYXJ0eSkgJT4lCiAgc3VtbWFyaXNlKHByb3BvcnRpb24gPSBtZWFuKHJlc3BvbnNlX25ldXRyYWwpKSAlPiUKICBnZ3Bsb3QoYWVzKHg9cG9saV9wYXJ0eSwgeT1wcm9wb3J0aW9uLCBmaWxsPXBvbGlfcGFydHkpKSArCiAgZ2VvbV9iYXIoc3RhdD0iaWRlbnRpdHkiKSArIAogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1icmFuX3BhbGV0dGUpICsgCiAgZmFjZXRfd3JhcCh+Z2VuZGVyKSArIAogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKyAKICBsYWJzKHg9IlBhcnRpY2lwYW50IFBvbGl0aWNhbCBQYXJ0eSIsIHk9IlByb3BvcnRpb24iLHRpdGxlPSJNZWFuIFByb3AuIG9mIE5ldXRyYWwgUmVzcG9uc2VzIGJ5IFN0aW11bGkgR2VuZGVyIikgKyAKICB0aGVtZSh0ZXh0PWVsZW1lbnRfdGV4dChzaXplPTE2KSkgKyAKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZT0yMCkpIApgYGAKCgoKYGBge3J9CmdlbmRlcl9jb21wYXJpc29ucyA8LSBsaXN0KCBjKCJtYWxlIiwiZmVtYWxlIikpCmBgYAoKYGBge3J9CnByb2RfZGF0YSAlPiUKICBmaWx0ZXIoIWlzLm5hKHBvbGlfcGFydHkpKSAlPiUKICBmaWx0ZXIocG9saV9wYXJ0eSAhPSAiTm9uLVBhcnRpc2FuIikgJT4lCiAgbXV0YXRlKHJlc3BvbnNlX25ldXRyYWwgPSBpZmVsc2UocmVzcG9uc2VfZ2VuZGVyID09ICJuZXV0cmFsIiwxLDApKSAlPiUKICBmaWx0ZXIoZ2VuZGVyIT0iZmlsbGVyIiAmIGdlbmRlciE9ICJhdHRlbnRpb24iICYgZ2VuZGVyIT0iIikgJT4lCiAgZ3JvdXBfYnkoZ2VuZGVyLHdvcmtlcmlkLHBvbGlfcGFydHksc3ViamVjdF9pbmZvcm1hdGlvbi5nZW5kZXIpICU+JQogIHN1bW1hcmlzZShwcm9wb3J0aW9uID0gbWVhbihyZXNwb25zZV9uZXV0cmFsKSkgJT4lCiAgZ2dwbG90KGFlcyh4PWdlbmRlciwgeT1wcm9wb3J0aW9uLCBmaWxsPWdlbmRlcikpICsKICBnZW9tX2JveHBsb3QodmFyd2lkdGggPSBUKSArIAogIGdlb21faml0dGVyKGFscGhhPTAuMSkgKyAKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9YnJhbl9wYWxldHRlKSArIAogIGZhY2V0X3dyYXAofnBvbGlfcGFydHkpICsgCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArIAogIGxhYnMoeD0iU3RpbXVsaSBHZW5kZXIiLCB5PSJQcm9wb3J0aW9uIix0aXRsZT0iTWVhbiBQcm9wLiBvZiBOZXV0cmFsIFJlc3BvbnNlcyBieSBTdGltdWxpIEdlbmRlciIpICsgCiAgdGhlbWUodGV4dD1lbGVtZW50X3RleHQoc2l6ZT0xNikpICsgCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGU9MjApKSAKYGBgCmBgYHtyfQpnZ3NhdmUoInByb2RfbmV1dHJhbF9wb2xpX2JveF9nZW5kZXIucG5nIiwgd2lkdGg9NywgaGVpZ2h0PTUscGF0aD0nL1VzZXJzL2JyYW5wYXAvRGVza3RvcC9nZW5kZXJfcHJvY2Vzc2luZy90YWxrc19hbmRfcGFwZXJzL3FwX3BhcGVyL2ZpZ3VyZXMnKQpgYGAgCgpgYGB7cn0KcHJvZF9kYXRhICU+JQogIGZpbHRlcighaXMubmEocG9saV9wYXJ0eSkpICU+JQogIG11dGF0ZShyZXNwb25zZV9uZXV0cmFsID0gaWZlbHNlKHJlc3BvbnNlX2dlbmRlciA9PSAibmV1dHJhbCIsMSwwKSkgJT4lCiAgZmlsdGVyKGdlbmRlciE9ImZpbGxlciIgJiBnZW5kZXIhPSAiYXR0ZW50aW9uIiAmIGdlbmRlciE9IiIpICU+JQogIGdyb3VwX2J5KHN1YmplY3RfaW5mb3JtYXRpb24uZ2VuZGVyLHdvcmtlcmlkLHBvbGlfcGFydHkpICU+JQogIHN1bW1hcmlzZShwcm9wb3J0aW9uID0gbWVhbihyZXNwb25zZV9uZXV0cmFsKSkgJT4lCiAgZ2dwbG90KGFlcyh4PXBvbGlfcGFydHksIHk9cHJvcG9ydGlvbiwgZmlsbD1wb2xpX3BhcnR5KSkgKwogIGdlb21fYm94cGxvdCh2YXJ3aWR0aCA9IFQpICsgCiAgZ2VvbV9qaXR0ZXIoYWxwaGE9MC4xKSArIAogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1icmFuX3BhbGV0dGUpICsgCiAgZmFjZXRfd3JhcCh+c3ViamVjdF9pbmZvcm1hdGlvbi5nZW5kZXIpICsgCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArIAogIGxhYnMoeD0iUGFydGljaXBhbnQgUG9saXRpY2FsIFBhcnR5IiwgeT0iUHJvcG9ydGlvbiIsdGl0bGU9Ik1lYW4gUHJvcC4gb2YgTmV1dHJhbCBSZXNwb25zZXMgYnkgU3RpbXVsaSBHZW5kZXIiKSArIAogIHRoZW1lKHRleHQ9ZWxlbWVudF90ZXh0KHNpemU9MTYpKSArIAogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlPTIwKSkgKyAKICBzdGF0X2NvbXBhcmVfbWVhbnMoY29tcGFyaXNvbnMgPSBteV9jb21wYXJpc29ucywgbGFiZWwgPSAicC5zaWduaWYiKQpgYGAKCgpgYGB7cn0KcHJvZF9kYXRhICU+JQogIGZpbHRlcihwb2xpX3BhcnR5ID09ICJEZW1vY3JhdCIgfCBwb2xpX3BhcnR5ID09IlJlcHVibGljYW4iKSAlPiUKICBtdXRhdGUocmVzcG9uc2VfbmV1dHJhbCA9IGlmZWxzZShyZXNwb25zZV9nZW5kZXIgPT0gIm5ldXRyYWwiLDEsMCkpICU+JQogIGZpbHRlcihnZW5kZXI9PSJtYWxlIikgJT4lCiAgZ3JvdXBfYnkod29ya2VyaWQscG9saV9wYXJ0eSkgJT4lCiAgc3VtbWFyaXNlKHByb3BvcnRpb24gPSBtZWFuKHJlc3BvbnNlX25ldXRyYWwpKSAlPiUKICBnZ3Bsb3QoYWVzKHg9cG9saV9wYXJ0eSwgeT1wcm9wb3J0aW9uLCBmaWxsPXBvbGlfcGFydHkpKSArCiAgZ2VvbV9ib3hwbG90KHZhcndpZHRoID0gVCkgKyAKICBnZW9tX2ppdHRlcihhbHBoYT0wLjEpICsgCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWJyYW5fcGFsZXR0ZSkgKyAKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpICsgCiAgbGFicyh4PSJQYXJ0aWNpcGFudCBQb2xpdGljYWwgUGFydHkiLCB5PSJQcm9wb3J0aW9uIix0aXRsZT0iTWVhbiBQcm9wLiBvZiBOZXV0cmFsIFJlc3BvbnNlcyBieSBTdGltdWxpIEdlbmRlciIpICsgCiAgdGhlbWUodGV4dD1lbGVtZW50X3RleHQoc2l6ZT0xNikpICsgCiAgdGhlbWUoYXhpcy50ZXh0LnggPSBlbGVtZW50X3RleHQoYW5nbGU9MjApKSArIAogIHN0YXRfY29tcGFyZV9tZWFucygpCmBgYApgYGB7cn0KcHJvZF9kYXRhICU+JQogIGZpbHRlcihwb2xpX3BhcnR5ID09ICJEZW1vY3JhdCIgfCBwb2xpX3BhcnR5ID09IlJlcHVibGljYW4iKSAlPiUKICBtdXRhdGUocmVzcG9uc2VfbmV1dHJhbCA9IGlmZWxzZShyZXNwb25zZV9nZW5kZXIgPT0gIm5ldXRyYWwiLDEsMCkpICU+JQogIGZpbHRlcihnZW5kZXI9PSJmZW1hbGUiKSAlPiUKICBncm91cF9ieSh3b3JrZXJpZCxwb2xpX3BhcnR5KSAlPiUKICBzdW1tYXJpc2UocHJvcG9ydGlvbiA9IG1lYW4ocmVzcG9uc2VfbmV1dHJhbCkpICU+JQogIGdncGxvdChhZXMoeD1wb2xpX3BhcnR5LCB5PXByb3BvcnRpb24sIGZpbGw9cG9saV9wYXJ0eSkpICsKICBnZW9tX2JveHBsb3QodmFyd2lkdGggPSBUKSArIAogIGdlb21faml0dGVyKGFscGhhPTAuMSkgKyAKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9YnJhbl9wYWxldHRlKSArIAogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKyAKICBsYWJzKHg9IlBhcnRpY2lwYW50IFBvbGl0aWNhbCBQYXJ0eSIsIHk9IlByb3BvcnRpb24iLHRpdGxlPSJNZWFuIFByb3AuIG9mIE5ldXRyYWwgUmVzcG9uc2VzIGJ5IFN0aW11bGkgR2VuZGVyIikgKyAKICB0aGVtZSh0ZXh0PWVsZW1lbnRfdGV4dChzaXplPTE2KSkgKyAKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZT0yMCkpICsgCiAgc3RhdF9jb21wYXJlX21lYW5zKCkKYGBgCioqR2VuZGVyIGJ5IEdlbmRlciwgbm8gSWRlb2xvZ3kqKgoKYGBge3J9CnByb2RfZGF0YSAlPiUKICBmaWx0ZXIobW9ycGhfdHlwZSA9PSJjb21wb3VuZCIpICU+JQogIGdncGxvdChhZXMoeD1nZW5kZXIsIGZpbGw9cmVzcG9uc2VfZ2VuZGVyKSkgKyAKICBnZW9tX2Jhcihwb3NpdGlvbj0iZmlsbCIpICsgCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzID0gYnJhbl9wYWxldHRlKSArIAogIGxhYnMoeD0iU3RpbXVsdXMgR2VuZGVyIiwgZmlsbD0iR2VuZGVyIG9mIFJlc3BvbnNlIiwgeT0iUHJvcG9ydGlvbiBvZiBSZXNwb25zZXMiLCB0aXRsZT0iR2VuZGVyIG9mIFJlc3BvbnNlIGJ5IEdlbmRlciBvZiBTdGltdWx1cyBOYW1lIikgKwogIHRoZW1lX21pbmltYWwoKQpgYGAKCioqTW9kZWxzKioKCmBgYHtyfQpwcm9kX2RhdGFfY29tcG91bmRzIDwtIHByb2RfZGF0YSAlPiUKICBmaWx0ZXIobW9ycGhfdHlwZSA9PSAiY29tcG91bmQiKSAlPiUKICBtdXRhdGUoY2dlbmRlcl90b3RhbCA9IHNjYWxlKGdlbmRlcl90b3RhbCkpICU+JQogIG11dGF0ZShyZXNwb25zZV9jb25ncnVlbmN5ID0gYXMubnVtZXJpYyhpZmVsc2UoY29uZ3J1ZW5jeT09InRydWUiLCIxIiwiMCIpKSkgJT4lCiAgbXV0YXRlKGNhZ2UgPSBzY2FsZShzdWJqZWN0X2luZm9ybWF0aW9uLmFnZSkpICU+JQogIG11dGF0ZShuZXV0cmFsaXR5X2JpbmFyeSA9IGlmZWxzZShuZXV0cmFsaXR5PT0idHJ1ZSIsMSwwKSkKYGBgCgpgYGB7cn0KZmluYWxfZGF0IDwtIG1lcmdlKHByb2RfZGF0YV9jb21wb3VuZHMsbGV4X2ZyZXFzLGJ5PSJsZXhlbWUiKSAlPiUKICBtdXRhdGUobmV1dHJhbGl0eV9iaW5hcnkgPSBpZmVsc2UobmV1dHJhbGl0eT09InRydWUiLDEsMCkpICU+JQogIGZpbHRlcihtb3JwaF90eXBlID09ICJjb21wb3VuZCIpICU+JQogIG11dGF0ZShjZ2VuZGVyX3RvdGFsID0gc2NhbGUoZ2VuZGVyX3RvdGFsKSkgJT4lCiAgbXV0YXRlKHJlc3BvbnNlX2NvbmdydWVuY3kgPSBhcy5udW1lcmljKGlmZWxzZShjb25ncnVlbmN5PT0idHJ1ZSIsIjEiLCIwIikpKSAlPiUKICBtdXRhdGUoY2FnZSA9IHNjYWxlKHN1YmplY3RfaW5mb3JtYXRpb24uYWdlKSkgJT4lCiAgbXV0YXRlKGNtZWFuX2xlZnRfbmV1dHJhbCA9IHNjYWxlKG1lYW5fbGVmdF9uZXV0cmFsKSkgJT4lCiAgbXV0YXRlKG1lYW5fYWxsID0gKG1lYW5fbGVmdF9uZXV0cmFsICsgbWVhbl9yaWdodF9uZXV0cmFsKS8yKSAlPiUKICBtdXRhdGUoY21lYW5fYWxsID0gc2NhbGUobWVhbl9hbGwpKQpgYGAKCmBgYHtyfQpwcm9kdWN0aW9uX21vZGVsX29uZSA8LSBsbWVyKG5ldXRyYWxpdHlfYmluYXJ5fmNnZW5kZXJfdG90YWwqcG9saV9wYXJ0eSArIGdlbmRlciArIGNtZWFuX2FsbCArICgxfHdvcmtlcmlkKSArICgxfGxleGVtZSkgKyAoMXxuYW1lKSArICgxfGNhZ2UpLGRhdGE9ZmluYWxfZGF0KQpgYGAKCmBgYHtyfQpzdW1tYXJ5KHByb2R1Y3Rpb25fbW9kZWxfb25lKQpgYGAKCgojIFNvbWUgUHJvcCBUYWJsZXMKCmBgYHtyfQoodGFibGUocHJvZF9kYXRhJHN1YmplY3RfaW5mb3JtYXRpb24uZ2VuZGVyKSkKYGBgCgoKCmBgYHtyfQpwcm9kX2dlbmRlcl90YWJsZSA8LSBwcm9kX2RhdGEgJT4lCiAgZ3JvdXBfYnkod29ya2VyaWQsc3ViamVjdF9pbmZvcm1hdGlvbi5nZW5kZXIscG9saV9wYXJ0eSkgJT4lCiAgc3VtbWFyaXNlKHN1YmplY3RfZ2VuZGVyID0gcGFzdGUodW5pcXVlKHN1YmplY3RfaW5mb3JtYXRpb24uZ2VuZGVyKSkpCgp0YWJsZShwcm9kX2dlbmRlcl90YWJsZSRzdWJqZWN0X2dlbmRlcixwcm9kX2dlbmRlcl90YWJsZSRwb2xpX3BhcnR5KQpgYGAKCmBgYHtyfQpwcm9kX2RhdGFfYWxsIDwtIHJlYWQuY3N2KCJwcm9kdWN0aW9uX2RhdGEuY3N2IikgJT4lCiAgZmlsdGVyKHR5cGU9PSJmaWxsZXJfc2VtYW50aWMiIHwgdHlwZT09ImZpbGxlcl9ncmFtbWF0aWNhbCIpICU+JQogIGdyb3VwX2J5KGxleGVtZSx0eXBlKSAlPiUKICBzdW1tYXJpc2UobGV4ZW1lPXBhc3RlKHVuaXF1ZShsZXhlbWUpKSkKYGBgCgpgYGB7cn0KdGFibGUocHJvZF9kYXRhX2FsbCR0eXBlKQpgYGAKCgpgYGB7cn0KcHJvZF9kYXRhX21lYW5zIDwtIHByb2RfZGF0YSAlPiUKICBmaWx0ZXIoIWlzLm5hKHBvbGlfcGFydHkpKSAlPiUKICBmaWx0ZXIocG9saV9wYXJ0eSAhPSAiTm9uLVBhcnRpc2FuIikgJT4lCiAgbXV0YXRlKHJlc3BvbnNlX25ldXRyYWwgPSBpZmVsc2UocmVzcG9uc2VfZ2VuZGVyID09ICJuZXV0cmFsIiwxLDApKSAlPiUKICBmaWx0ZXIoZ2VuZGVyIT0iZmlsbGVyIiAmIGdlbmRlciE9ICJhdHRlbnRpb24iICYgZ2VuZGVyIT0iIikgJT4lCiAgZ3JvdXBfYnkoZ2VuZGVyLHdvcmtlcmlkLHBvbGlfcGFydHksc3ViamVjdF9pbmZvcm1hdGlvbi5nZW5kZXIsc3ViamVjdF9pbmZvcm1hdGlvbi5hZ2Usc3ViamVjdF9pbmZvcm1hdGlvbi5lZHVjYXRpb24sZ2VuZGVyX3RvdGFsKSAlPiUKICBzdW1tYXJpc2UocHJvcG9ydGlvbiA9IG1lYW4ocmVzcG9uc2VfbmV1dHJhbCkpIApgYGAKCmBgYHtyfQp0YWJsZShwcm9kX2RhdGFfbWVhbnMkcHJvcG9ydGlvbixwcm9kX2RhdGFfbWVhbnMkcG9saV9wYXJ0eSxwcm9kX2RhdGFfbWVhbnMkZ2VuZGVyKQpgYGAKCgpgYGB7cn0KcHJvZHVjdGlvbl9tb2RlbF90d28gPC0gbG1lcihwcm9wb3J0aW9ufnBvbGlfcGFydHkqZ2VuZGVyICsgKDF8d29ya2VyaWQpICsgKDF8c3ViamVjdF9pbmZvcm1hdGlvbi5hZ2UpICsgKDF8c3ViamVjdF9pbmZvcm1hdGlvbi5nZW5kZXIpLCBkYXRhPXByb2RfZGF0YV9tZWFucykKYGBgCgpgYGB7cn0Kc3VtbWFyeShwcm9kdWN0aW9uX21vZGVsX3R3bykKYGBgCgpgYGB7cn0KcHJvZF9kYXRhX21lYW5zX21hbGUgPC0gcHJvZF9kYXRhICU+JQogIGZpbHRlcighaXMubmEocG9saV9wYXJ0eSkpICU+JQogIGZpbHRlcihwb2xpX3BhcnR5ICE9ICJOb24tUGFydGlzYW4iKSAlPiUKICBtdXRhdGUocmVzcG9uc2VfbmV1dHJhbCA9IGlmZWxzZShyZXNwb25zZV9nZW5kZXIgPT0gIm5ldXRyYWwiLDEsMCkpICU+JQogIGZpbHRlcihnZW5kZXIhPSJmaWxsZXIiICYgZ2VuZGVyIT0gImF0dGVudGlvbiIgJiBnZW5kZXIhPSIiICYgZ2VuZGVyIT0iZmVtYWxlIikgJT4lCiAgZ3JvdXBfYnkod29ya2VyaWQscG9saV9wYXJ0eSxzdWJqZWN0X2luZm9ybWF0aW9uLmdlbmRlcixzdWJqZWN0X2luZm9ybWF0aW9uLmFnZSxzdWJqZWN0X2luZm9ybWF0aW9uLmVkdWNhdGlvbikgJT4lCiAgc3VtbWFyaXNlKHByb3BvcnRpb24gPSBtZWFuKHJlc3BvbnNlX25ldXRyYWwpKSAKYGBgCgpgYGB7cn0KcHJvZHVjdGlvbl9tb2RlbF90aHJlZSA8LSBsbWVyKHByb3BvcnRpb25+cG9saV9wYXJ0eSArKDF8c3ViamVjdF9pbmZvcm1hdGlvbi5hZ2UpICsgKDF8c3ViamVjdF9pbmZvcm1hdGlvbi5nZW5kZXIpLCBkYXRhPXByb2RfZGF0YV9tZWFuc19tYWxlKQpgYGAKCmBgYHtyfQpzdW1tYXJ5KHByb2R1Y3Rpb25fbW9kZWxfdGhyZWUpCmBgYAoKYGBge3J9CnByb2RfZGF0YV9tZWFuc19mZW1hbGUgPC0gcHJvZF9kYXRhICU+JQogIGZpbHRlcighaXMubmEocG9saV9wYXJ0eSkpICU+JQogIGZpbHRlcihwb2xpX3BhcnR5ICE9ICJOb24tUGFydGlzYW4iKSAlPiUKICBtdXRhdGUocmVzcG9uc2VfbmV1dHJhbCA9IGlmZWxzZShyZXNwb25zZV9nZW5kZXIgPT0gIm5ldXRyYWwiLDEsMCkpICU+JQogIGZpbHRlcihnZW5kZXIhPSJmaWxsZXIiICYgZ2VuZGVyIT0gImF0dGVudGlvbiIgJiBnZW5kZXIhPSIiICYgZ2VuZGVyIT0ibWFsZSIpICU+JQogIGdyb3VwX2J5KHdvcmtlcmlkLHBvbGlfcGFydHksc3ViamVjdF9pbmZvcm1hdGlvbi5nZW5kZXIsc3ViamVjdF9pbmZvcm1hdGlvbi5hZ2Usc3ViamVjdF9pbmZvcm1hdGlvbi5lZHVjYXRpb24pICU+JQogIHN1bW1hcmlzZShwcm9wb3J0aW9uID0gbWVhbihyZXNwb25zZV9uZXV0cmFsKSkgCmBgYAoKYGBge3J9CnByb2R1Y3Rpb25fbW9kZWxfZm91ciA8LSBsbWVyKHByb3BvcnRpb25+cG9saV9wYXJ0eSArKDF8c3ViamVjdF9pbmZvcm1hdGlvbi5hZ2UpICsgKDF8c3ViamVjdF9pbmZvcm1hdGlvbi5nZW5kZXIpLCBkYXRhPXByb2RfZGF0YV9tZWFuc19mZW1hbGUpCmBgYAoKYGBge3J9CnN1bW1hcnkocHJvZHVjdGlvbl9tb2RlbF9mb3VyKQpgYGAKCmBgYHtyfQpwcm9kX2RhdGFfbWVhbnNfYWxsIDwtIHByb2RfZGF0YSAlPiUKICBmaWx0ZXIoIWlzLm5hKHBvbGlfcGFydHkpKSAlPiUKICBtdXRhdGUocmVzcG9uc2VfbmV1dHJhbCA9IGlmZWxzZShyZXNwb25zZV9nZW5kZXIgPT0gIm5ldXRyYWwiLDEsMCkpICU+JQogIGZpbHRlcihnZW5kZXIhPSJmaWxsZXIiICYgZ2VuZGVyIT0gImF0dGVudGlvbiIgJiBnZW5kZXIhPSIiKSAlPiUKICBncm91cF9ieShnZW5kZXIsd29ya2VyaWQscG9saV9wYXJ0eSxzdWJqZWN0X2luZm9ybWF0aW9uLmdlbmRlcixzdWJqZWN0X2luZm9ybWF0aW9uLmFnZSxzdWJqZWN0X2luZm9ybWF0aW9uLmVkdWNhdGlvbixnZW5kZXJfdG90YWwpICU+JQogIHN1bW1hcmlzZShwcm9wb3J0aW9uID0gbWVhbihyZXNwb25zZV9uZXV0cmFsKSkgCmBgYAoKYGBge3J9CnByb2RfZGF0YSAlPiUKICBmaWx0ZXIoIWlzLm5hKHBvbGlfcGFydHkpKSAlPiUKICBtdXRhdGUocmVzcG9uc2VfbmV1dHJhbCA9IGlmZWxzZShyZXNwb25zZV9nZW5kZXIgPT0gIm5ldXRyYWwiLDEsMCkpICU+JQogIGZpbHRlcihnZW5kZXIhPSJmaWxsZXIiICYgZ2VuZGVyIT0gImF0dGVudGlvbiIgJiBnZW5kZXIhPSIiKSAlPiUKICBncm91cF9ieShnZW5kZXIsd29ya2VyaWQscG9saV9wYXJ0eSxzdWJqZWN0X2luZm9ybWF0aW9uLmdlbmRlcikgJT4lCiAgc3VtbWFyaXNlKHByb3BvcnRpb24gPSBtZWFuKHJlc3BvbnNlX25ldXRyYWwpKSAlPiUKICBnZ3Bsb3QoYWVzKHg9cHJvcG9ydGlvbiwgZmlsbD1wb2xpX3BhcnR5KSkgKwogIGdlb21faGlzdG9ncmFtKCkgKyAKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9YnJhbl9wYWxldHRlKSArIAogIGZhY2V0X2dyaWQocG9saV9wYXJ0eX5nZW5kZXIpICsgCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArIAogIGxhYnMoeD0iUHJvcG9ydGlvbiBvZiBSZXNwb25zZXMiLCB5PSJOdW1iZXIgb2YgUGFydGljaXBhbnRzIix0aXRsZT0iUHJvcG9ydGlvbnMgb2YgTmV1dHJhbCBSZXNwb25zZXMgYnkgU3RpbXVsaSBHZW5kZXIiLCBmaWxsPSJQb2xpdGljYWwgUGFydHkiKSArIAogIHRoZW1lKHRleHQ9ZWxlbWVudF90ZXh0KHNpemU9MTYpKSArIAogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlPTIwKSkgKwogIHRoZW1lX2dyZXkoKQojJSsgIyAgc3RhdF9jb21wYXJlX21lYW5zKGNvbXBhcmlzb25zID0gbXlfY29tcGFyaXNvbnMsIGxhYmVsID0gInAuc2lnbmlmIikKYGBgCgpgYGB7cn0KcHJvZF9kYXRhICU+JQogIGZpbHRlcighaXMubmEocG9saV9wYXJ0eSkpICU+JQogIGZpbHRlcihwb2xpX3BhcnR5ICE9ICJOb24tUGFydGlzYW4iKSAlPiUKICBtdXRhdGUocmVzcG9uc2VfbmV1dHJhbCA9IGlmZWxzZShyZXNwb25zZV9nZW5kZXIgPT0gIm5ldXRyYWwiLDEsMCkpICU+JQogIGZpbHRlcihnZW5kZXIhPSJmaWxsZXIiICYgZ2VuZGVyIT0gImF0dGVudGlvbiIgJiBnZW5kZXIhPSIiKSAlPiUKICBmaWx0ZXIobGV4ZW1lPT0iZmxpZ2h0IGF0dGVuZGFudCIpICU+JQogIGdyb3VwX2J5KGdlbmRlcix3b3JrZXJpZCxwb2xpX3BhcnR5LHN1YmplY3RfaW5mb3JtYXRpb24uZ2VuZGVyKSAlPiUKICBzdW1tYXJpc2UocHJvcG9ydGlvbiA9IG1lYW4ocmVzcG9uc2VfbmV1dHJhbCkpICU+JQogIGdncGxvdChhZXMoeD1nZW5kZXIsIHk9cHJvcG9ydGlvbiwgZmlsbD1nZW5kZXIpKSArCiAgZ2VvbV9ib3hwbG90KHZhcndpZHRoID0gVCkgKyAKICBnZW9tX2ppdHRlcihhbHBoYT0wLjEpICsgCiAgc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWJyYW5fcGFsZXR0ZSkgKyAKICBmYWNldF93cmFwKH5wb2xpX3BhcnR5KSArIAogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikgKyAKICBsYWJzKHg9IlN0aW11bGkgR2VuZGVyIiwgeT0iUHJvcG9ydGlvbiIsdGl0bGU9Ik1lYW4gUHJvcC4gb2YgTmV1dHJhbCBSZXNwb25zZXMgYnkgU3RpbXVsaSBHZW5kZXIiKSArIAogIHRoZW1lKHRleHQ9ZWxlbWVudF90ZXh0KHNpemU9MTYpKSArIAogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlPTIwKSkgCmBgYAoKCgoKYGBge3J9CnByb2RfZGF0YV9tZWFuc19yZXAgPC0gcHJvZF9kYXRhX21lYW5zICU+JQogIGZpbHRlcihwb2xpX3BhcnR5ID09ICJSZXB1YmxpY2FuIikKYGBgCgoKYGBge3J9CnByb2R1Y3Rpb25fbW9kZWxfZml2ZSA8LSBsbWVyKHByb3BvcnRpb25+Z2VuZGVyX3RvdGFsICsgKDF8c3ViamVjdF9pbmZvcm1hdGlvbi5hZ2UpLCBkYXRhPXByb2RfZGF0YV9tZWFuc19yZXApCmBgYAoKYGBge3J9CnN1bW1hcnkocHJvZHVjdGlvbl9tb2RlbF9maXZlKQpgYGAKCgpgYGB7cn0KcHJvZF9kYXRhX21lYW5zX2RlbSA8LSBwcm9kX2RhdGFfbWVhbnMgJT4lCiAgZmlsdGVyKHBvbGlfcGFydHkgPT0gIkRlbW9jcmF0IikKYGBgCgpgYGB7cn0KcHJvZHVjdGlvbl9tb2RlbF9maXZlIDwtIGxtZXIocHJvcG9ydGlvbn5nZW5kZXJfdG90YWwgKyAoMXx3b3JrZXJpZCksIGRhdGE9cHJvZF9kYXRhX21lYW5zX2RlbSkKYGBgCgpgYGB7cn0Kc3VtbWFyeShwcm9kdWN0aW9uX21vZGVsX2ZpdmUpCmBgYAoKCmBgYHtyfQpwcm9kX2RhdGEgJT4lCiAgZmlsdGVyKCFpcy5uYShwb2xpX3BhcnR5KSkgJT4lCiAgZmlsdGVyKG1vcnBoX3R5cGUgPT0gImNvbXBvdW5kIikgJT4lCiAgbXV0YXRlKHJlc3BvbnNlX25ldXRyYWwgPSBpZmVsc2UocmVzcG9uc2VfZ2VuZGVyID09ICJuZXV0cmFsIiwxLDApKSAlPiUKICBmaWx0ZXIoZ2VuZGVyIT0iZmlsbGVyIiAmIGdlbmRlciE9ICJhdHRlbnRpb24iICYgZ2VuZGVyIT0iIikgJT4lCiAgZ3JvdXBfYnkoZ2VuZGVyLGxleGVtZSxwb2xpX3BhcnR5LHN1YmplY3RfaW5mb3JtYXRpb24uZ2VuZGVyKSAlPiUKICBzdW1tYXJpc2UocHJvcG9ydGlvbiA9IG1lYW4ocmVzcG9uc2VfbmV1dHJhbCkpICU+JQogIGdncGxvdChhZXMoeD1nZW5kZXIsIHk9cHJvcG9ydGlvbikpICsKICBnZW9tX2JveHBsb3QodmFyd2lkdGg9VCkgKyAKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXM9YnJhbl9wYWxldHRlKSArIAojICBmYWNldF93cmFwKH5sZXhlbWUpICsgCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArIAogIGxhYnMoeD0iUHJvcG9ydGlvbiBvZiBSZXNwb25zZXMiLCB5PSJOdW1iZXIgb2YgUGFydGljaXBhbnRzIix0aXRsZT0iUHJvcG9ydGlvbnMgb2YgTmV1dHJhbCBSZXNwb25zZXMgYnkgU3RpbXVsaSBHZW5kZXIiLCBmaWxsPSJQb2xpdGljYWwgUGFydHkiKSArIAogIHRoZW1lKHRleHQ9ZWxlbWVudF90ZXh0KHNpemU9MTYpKSArIAogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlPTIwKSkgKwogIHRoZW1lX2dyZXkoKSArIAogIHN0YXRfY29tcGFyZV9tZWFucygpCmBgYApgYGB7cn0KcHJvZF9kYXRhICU+JQogIGZpbHRlcighaXMubmEocG9saV9wYXJ0eSkpICU+JQogIGZpbHRlcihsZXhlbWUgPT0gImZsaWdodCBhdHRlbmRhbnQiKSAlPiUKICBtdXRhdGUocmVzcG9uc2VfbmV1dHJhbCA9IGlmZWxzZShyZXNwb25zZV9nZW5kZXIgPT0gIm5ldXRyYWwiLDEsMCkpICU+JQogIGZpbHRlcihnZW5kZXIhPSJmaWxsZXIiICYgZ2VuZGVyIT0gImF0dGVudGlvbiIgJiBnZW5kZXIhPSIiKSAlPiUKICBncm91cF9ieShnZW5kZXIpICU+JQogIHN1bW1hcml6ZShhdmVyYWdlX2ZsaWdodCA9IG1lYW4ocmVzcG9uc2VfbmV1dHJhbCkpICU+JQogIGdncGxvdChhZXMoeD1nZW5kZXIsIHk9YXZlcmFnZV9mbGlnaHQpKSArCiAgZ2VvbV9iYXIoc3RhdD0iaWRlbnRpdHkiKSArIAogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcz1icmFuX3BhbGV0dGUpICsgCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArIAogIGxhYnMoeD0iUHJvcG9ydGlvbiBvZiBSZXNwb25zZXMiLCB5PSJOdW1iZXIgb2YgUGFydGljaXBhbnRzIix0aXRsZT0iUHJvcG9ydGlvbnMgb2YgTmV1dHJhbCBSZXNwb25zZXMgYnkgU3RpbXVsaSBHZW5kZXIiLCBmaWxsPSJQb2xpdGljYWwgUGFydHkiKSArIAogIHRoZW1lKHRleHQ9ZWxlbWVudF90ZXh0KHNpemU9MTYpKSArIAogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlPTIwKSkgKwogIHRoZW1lX2dyZXkoKSArIAogIHN0YXRfY29tcGFyZV9tZWFucygpCmBgYAoKCmBgYHtyfQpwcm9kX2RhdGEgJT4lCiAgZmlsdGVyKCFpcy5uYShwb2xpX3BhcnR5KSkgJT4lCiAgI2ZpbHRlcihwb2xpX3BhcnR5ICE9ICJOb24tUGFydGlzYW4iKSAlPiUKICBncm91cF9ieShwb2xpX3BhcnR5KSAlPiUKICBzdW1tYXJpemUobWVhbl9pZGVvID0gbWVhbihnZW5kZXJfdG90YWwpLCBDSS5Mb3cgPSBjaS5sb3coZ2VuZGVyX3RvdGFsKSwgQ0kuSGlnaCA9IGNpLmhpZ2goZ2VuZGVyX3RvdGFsKSkgJT4lCiAgbXV0YXRlKFlNaW4gPSBtZWFuX2lkZW8gLSBDSS5Mb3csIFlNYXggPSBtZWFuX2lkZW8gKyBDSS5IaWdoKSAlPiUKICBnZ3Bsb3QoYWVzKHg9cG9saV9wYXJ0eSx5PW1lYW5faWRlbyxmaWxsPXBvbGlfcGFydHkpKSArIAogIGdlb21fYmFyKHN0YXQ9J2lkZW50aXR5JykgKyAKICAjZ2VvbV9wb2ludChkYXRhPXByb2RfZGF0YSwgYWVzKHg9cG9saV9wYXJ0eSx5PWdlbmRlcl90b3RhbCksYWxwaGE9MC4xNSwgcG9zaXRpb249ImppdHRlciIpICsgCiAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbj1ZTWluLHltYXg9WU1heCksd2lkdGg9LjI1KSArIAogIHRoZW1lX2J3KCkgKyAKICBsYWJzKHg9IlBhcnRpY2lwYW50IFBvbGl0aWNhbCBQYXJ0eSIsIHk9Ik1lYW4gR2VuZGVyIElkZW9sb2d5IikgKyAKICB0aGVtZSh0ZXh0PWVsZW1lbnRfdGV4dChzaXplPTE2KSkgKyAKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZT01LCB2anVzdCA9IC43KSkgKyAKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBicmFuX3BhbGV0dGUpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpCmBgYAoKYGBge3J9Cmdnc2F2ZSgicHJvZF9pZGVvbG9neV9wYXJ0eS5wbmciLCB3aWR0aD03LCBoZWlnaHQ9NSxwYXRoPScvVXNlcnMvYnJhbnBhcC9EZXNrdG9wL2dlbmRlcl9wcm9jZXNzaW5nL3RhbGtzX2FuZF9wYXBlcnMvcXBfcGFwZXIvZmlndXJlcycpCmBgYAoKYGBge3J9CnByb2RfZGF0YSAlPiUKICBncm91cF9ieSh3b3JrZXJpZCxwb2xpX3BhcnR5LGdlbmRlcl90b3RhbCkgJT4lCiAgZ2dwbG90KGFlcyh4PXBvbGlfcGFydHksIHk9Z2VuZGVyX3RvdGFsKSkgKyAKICBnZW9tX2JveHBsb3QoKQpgYGAKCmBgYHtyfQpmaW5hbF9kYXRfZmxpZ2h0IDwtIGZpbmFsX2RhdCAlPiUKICBmaWx0ZXIobGV4ZW1lPT0iZmxpZ2h0IGF0dGVuZGFudCIpCmBgYAoKCmBgYHtyfQpwcm9kdWN0aW9uX21vZGVsX2ZsaWdodCA8LSBsbWVyKG5ldXRyYWxpdHlfYmluYXJ5fmdlbmRlciArICgxfG5hbWUpLCBkYXRhPWZpbmFsX2RhdF9mbGlnaHQpCmBgYAoKYGBge3J9CnN1bW1hcnkocHJvZHVjdGlvbl9tb2RlbF9mbGlnaHQpCmBgYAoKCmBgYHtyfQpwcm9kX2RhdGFfbWVhbnNfYWxsICU+JQogIGZpbHRlcighaXMubmEocG9saV9wYXJ0eSkpICU+JQogICNmaWx0ZXIocG9saV9wYXJ0eSAhPSAiTm9uLVBhcnRpc2FuIikgJT4lCiAgZ3JvdXBfYnkoZ2VuZGVyLHBvbGlfcGFydHkpICU+JQogIHN1bW1hcml6ZShtZWFuX3Byb3AgPSBtZWFuKHByb3BvcnRpb24pLCBDSS5Mb3cgPSBjaS5sb3cocHJvcG9ydGlvbiksIENJLkhpZ2ggPSBjaS5oaWdoKHByb3BvcnRpb24pKSAlPiUKICBtdXRhdGUoWU1pbiA9IG1lYW5fcHJvcCAtIENJLkxvdywgWU1heCA9IG1lYW5fcHJvcCArIENJLkhpZ2gpICU+JQogIGdncGxvdChhZXMoeD1wb2xpX3BhcnR5LHk9bWVhbl9wcm9wLGZpbGw9cG9saV9wYXJ0eSkpICsgCiAgZ2VvbV9iYXIoc3RhdD0naWRlbnRpdHknKSArIAogIGdlb21fcG9pbnQoZGF0YT1wcm9kX2RhdGFfbWVhbnNfYWxsLCBhZXMoeD1wb2xpX3BhcnR5LHk9cHJvcG9ydGlvbiksYWxwaGE9MC4xNSwgcG9zaXRpb249ImppdHRlciIpICsgCiAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbj1ZTWluLHltYXg9WU1heCksd2lkdGg9LjI1KSArIAogIGZhY2V0X3dyYXAofiBnZW5kZXIpICsgCiAgdGhlbWVfYncoKSArIAogIGxhYnMoeD0iUGFydGljaXBhbnQgUG9saXRpY2FsIFBhcnR5IiwgeT0iTWVhbiBQcm9wb3J0aW9uIG9mIE5ldXRyYWwgUmVzcG9uc2VzIix0aXRsZT0iTmV1dHJhbCBSZXNwb25zZXMgYnkgU3RpbXVsaSBHZW5kZXIiKSArIAogIHRoZW1lKHRleHQ9ZWxlbWVudF90ZXh0KHNpemU9MTYpKSArIAogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlPTUsIHZqdXN0ID0gLjcpKSArIAogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGJyYW5fcGFsZXR0ZSkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikKYGBgCmBgYHtyfQpnZ3NhdmUoInByb2RfbmV1dHJhbF9wb2xpX2Jhcl9nZW5kZXIucG5nIiwgd2lkdGg9NywgaGVpZ2h0PTUscGF0aD0nL1VzZXJzL2JyYW5wYXAvRGVza3RvcC9nZW5kZXJfcHJvY2Vzc2luZy90YWxrc19hbmRfcGFwZXJzL3FwX3BhcGVyL2ZpZ3VyZXMnKQpgYGAKCgpgYGB7cn0KcHJvZF9kYXRhICU+JQogIGZpbHRlcighaXMubmEocG9saV9wYXJ0eSkpICU+JQogIGZpbHRlcihtb3JwaF90eXBlID09ICJjb21wb3VuZCIpICU+JQogIG11dGF0ZShyZXNwb25zZV9uZXV0cmFsID0gaWZlbHNlKHJlc3BvbnNlX2dlbmRlciA9PSAibmV1dHJhbCIsMSwwKSkgJT4lCiAgZmlsdGVyKGdlbmRlciE9ImZpbGxlciIgJiBnZW5kZXIhPSAiYXR0ZW50aW9uIiAmIGdlbmRlciE9IiIpICU+JQogICNmaWx0ZXIocG9saV9wYXJ0eSAhPSAiTm9uLVBhcnRpc2FuIikgJT4lCiAgZ3JvdXBfYnkoZ2VuZGVyLHBvbGlfcGFydHkpICU+JQogIHN1bW1hcml6ZShtZWFuX3Byb3AgPSBtZWFuKHJlc3BvbnNlX25ldXRyYWwpLCBDSS5Mb3cgPSBjaS5sb3cocmVzcG9uc2VfbmV1dHJhbCksIENJLkhpZ2ggPSBjaS5oaWdoKHJlc3BvbnNlX25ldXRyYWwpKSAlPiUKICBtdXRhdGUoWU1pbiA9IG1lYW5fcHJvcCAtIENJLkxvdywgWU1heCA9IG1lYW5fcHJvcCArIENJLkhpZ2gpICU+JQogIGdncGxvdChhZXMoeD1wb2xpX3BhcnR5LHk9bWVhbl9wcm9wLGZpbGw9cG9saV9wYXJ0eSkpICsgCiAgZ2VvbV9iYXIoc3RhdD0naWRlbnRpdHknKSArIAogIGdlb21fcG9pbnQoZGF0YT1wcm9kX2RhdGFfbWVhbnNfYWxsLCBhZXMoeD1wb2xpX3BhcnR5LHk9cHJvcG9ydGlvbiksYWxwaGE9MC4xNSwgcG9zaXRpb249ImppdHRlciIpICsgCiAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbj1ZTWluLHltYXg9WU1heCksd2lkdGg9LjI1KSArIAogIGZhY2V0X3dyYXAofiBnZW5kZXIpICsgCiAgdGhlbWVfYncoKSArIAogIGxhYnMoeD0iUGFydGljaXBhbnQgUG9saXRpY2FsIFBhcnR5IiwgeT0iTWVhbiBQcm9wb3J0aW9uIG9mIE5ldXRyYWwgUmVzcG9uc2VzIix0aXRsZT0iTmV1dHJhbCBSZXNwb25zZXMgYnkgU3RpbXVsaSBHZW5kZXIiKSArIAogIHRoZW1lKHRleHQ9ZWxlbWVudF90ZXh0KHNpemU9MTYpKSArIAogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlPTUsIHZqdXN0ID0gLjcpKSArIAogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGJyYW5fcGFsZXR0ZSkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikKYGBgCmBgYHtyfQpnZ3NhdmUoInByb2RfbmV1dHJhbF9wb2xpX2Jhcl9ub25tZWFuLnBuZyIsIHdpZHRoPTcsIGhlaWdodD01LHBhdGg9Jy9Vc2Vycy9icmFucGFwL0Rlc2t0b3AvZ2VuZGVyX3Byb2Nlc3NpbmcvdGFsa3NfYW5kX3BhcGVycy9xcF9wYXBlci9maWd1cmVzJykKYGBgCgpgYGB7cn0KcHJvZF9kYXRhX2JpbmFyeV9wYXJ0eSA8LSBwcm9kX2RhdGEgJT4lCiAgZmlsdGVyKHBvbGlfcGFydHkgPT0gIkRlbW9jcmF0IiB8IHBvbGlfcGFydHkgPT0gIlJlcHVibGljYW4iKSAlPiUKICBtdXRhdGUocmVzcG9uc2VfbmV1dHJhbCA9IGlmZWxzZShyZXNwb25zZV9nZW5kZXIgPT0gIm5ldXRyYWwiLDEsMCkpICU+JQogIGZpbHRlcihnZW5kZXIhPSJmaWxsZXIiICYgZ2VuZGVyIT0gImF0dGVudGlvbiIgJiBnZW5kZXIhPSIiKSAlPiUKICBmaWx0ZXIobW9ycGhfdHlwZSA9PSAiY29tcG91bmQiKQpgYGAKCgpgYGB7cn0KcHJvZF9uZXV0cmFsX3BvbGlfbm9tZWFuX21vZGVsIDwtIGxtZXIocmVzcG9uc2VfbmV1dHJhbH5wb2xpX3BhcnR5ICsgZ2VuZGVyICsgKDF8bGV4ZW1lKSArICgxfG5hbWUpICsgKDF8d29ya2VyaWQpLGRhdGE9cHJvZF9kYXRhX2JpbmFyeV9wYXJ0eSkKYGBgCgpgYGB7cn0Kc3VtbWFyeShwcm9kX25ldXRyYWxfcG9saV9ub21lYW5fbW9kZWwpCmBgYAoKCmBgYHtyfQpwcm9kX2RhdGEgJT4lCiAgZmlsdGVyKCFpcy5uYShwb2xpX3BhcnR5KSkgJT4lCiAgZmlsdGVyKG1vcnBoX3R5cGUgPT0gImNvbXBvdW5kIikgJT4lCiAgbXV0YXRlKHJlc3BvbnNlX25ldXRyYWwgPSBpZmVsc2UocmVzcG9uc2VfZ2VuZGVyID09ICJuZXV0cmFsIiwxLDApKSAlPiUKICBmaWx0ZXIoZ2VuZGVyIT0iZmlsbGVyIiAmIGdlbmRlciE9ICJhdHRlbnRpb24iICYgZ2VuZGVyIT0iIikgJT4lCiAgI2ZpbHRlcihwb2xpX3BhcnR5ICE9ICJOb24tUGFydGlzYW4iKSAlPiUKICBncm91cF9ieShnZW5kZXIscG9saV9wYXJ0eSkgJT4lCiAgc3VtbWFyaXplKG1lYW5fcHJvcCA9IG1lYW4ocmVzcG9uc2VfbmV1dHJhbCksIENJLkxvdyA9IGNpLmxvdyhyZXNwb25zZV9uZXV0cmFsKSwgQ0kuSGlnaCA9IGNpLmhpZ2gocmVzcG9uc2VfbmV1dHJhbCkpICU+JQogIG11dGF0ZShZTWluID0gbWVhbl9wcm9wIC0gQ0kuTG93LCBZTWF4ID0gbWVhbl9wcm9wICsgQ0kuSGlnaCkgJT4lCiAgZ2dwbG90KGFlcyh4PWdlbmRlcix5PW1lYW5fcHJvcCxmaWxsPWdlbmRlcikpICsgCiAgZ2VvbV9iYXIoc3RhdD0naWRlbnRpdHknKSArIAogIGdlb21fcG9pbnQoZGF0YT1wcm9kX2RhdGFfbWVhbnNfYWxsLCBhZXMoeD1nZW5kZXIseT1wcm9wb3J0aW9uKSxhbHBoYT0wLjE1LCBwb3NpdGlvbj0iaml0dGVyIikgKyAKICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluPVlNaW4seW1heD1ZTWF4KSx3aWR0aD0uMjUpICsgCiAgZmFjZXRfd3JhcCh+IHBvbGlfcGFydHkpICsgCiAgdGhlbWVfYncoKSArIAogIGxhYnMoeD0iU3RpbXVsdXMgR2VuZGVyIiwgeT0iTWVhbiBQcm9wb3J0aW9uIG9mIE5ldXRyYWwgUmVzcG9uc2VzIix0aXRsZT0iTmV1dHJhbCBSZXNwb25zZXMgYnkgU3RpbXVsaSBHZW5kZXIiKSArIAogIHRoZW1lKHRleHQ9ZWxlbWVudF90ZXh0KHNpemU9MTYpKSArIAogIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlPTUsIHZqdXN0ID0gLjcpKSArIAogIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGJyYW5fcGFsZXR0ZSkgKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJub25lIikKYGBgCgpgYGB7cn0KZ2dzYXZlKCJwcm9kX25ldXRyYWxfZ2VuZGVyX2Jhcl9ub25tZWFuLnBuZyIsIHdpZHRoPTcsIGhlaWdodD01LHBhdGg9Jy9Vc2Vycy9icmFucGFwL0Rlc2t0b3AvZ2VuZGVyX3Byb2Nlc3NpbmcvdGFsa3NfYW5kX3BhcGVycy9xcF9wYXBlci9maWd1cmVzJykKYGBgCgpgYGB7cn0KcHJvZF9kYXRhX21lYW5zX2FsbCAlPiUKICBmaWx0ZXIoIWlzLm5hKHBvbGlfcGFydHkpKSAlPiUKICAjZmlsdGVyKHBvbGlfcGFydHkgIT0gIk5vbi1QYXJ0aXNhbiIpICU+JQogIGdyb3VwX2J5KGdlbmRlcixwb2xpX3BhcnR5KSAlPiUKICBzdW1tYXJpemUobWVhbl9wcm9wID0gbWVhbihwcm9wb3J0aW9uKSwgQ0kuTG93ID0gY2kubG93KHByb3BvcnRpb24pLCBDSS5IaWdoID0gY2kuaGlnaChwcm9wb3J0aW9uKSkgJT4lCiAgbXV0YXRlKFlNaW4gPSBtZWFuX3Byb3AgLSBDSS5Mb3csIFlNYXggPSBtZWFuX3Byb3AgKyBDSS5IaWdoKSAlPiUKICBnZ3Bsb3QoYWVzKHg9Z2VuZGVyLHk9bWVhbl9wcm9wLGZpbGw9Z2VuZGVyKSkgKyAKICBnZW9tX2JhcihzdGF0PSdpZGVudGl0eScpICsgCiAgZ2VvbV9wb2ludChkYXRhPXByb2RfZGF0YV9tZWFuc19hbGwsIGFlcyh4PWdlbmRlcix5PXByb3BvcnRpb24pLGFscGhhPTAuMTUsIHBvc2l0aW9uPSJqaXR0ZXIiKSArIAogIGdlb21fZXJyb3JiYXIoYWVzKHltaW49WU1pbix5bWF4PVlNYXgpLHdpZHRoPS4yNSkgKyAKICBmYWNldF93cmFwKH4gcG9saV9wYXJ0eSkgKyAKICB0aGVtZV9idygpICsgCiAgbGFicyh4PSJHZW5kZXIgU2VlbiIsIHk9Ik1lYW4gUHJvcG9ydGlvbiBvZiBOZXV0cmFsIFJlc3BvbnNlcyIsdGl0bGU9Ik5ldXRyYWwgUmVzcG9uc2VzIGJ5IFN0aW11bGkgR2VuZGVyIikgKyAKICB0aGVtZSh0ZXh0PWVsZW1lbnRfdGV4dChzaXplPTE2KSkgKyAKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZT01LCB2anVzdCA9IC43KSkgKyAKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBicmFuX3BhbGV0dGUpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpCmBgYApgYGB7cn0KZ2dzYXZlKCJwcm9kX25ldXRyYWxfZ2VuZGVyX2Jhci5wbmciLCB3aWR0aD03LCBoZWlnaHQ9NSxwYXRoPScvVXNlcnMvYnJhbnBhcC9EZXNrdG9wL2dlbmRlcl9wcm9jZXNzaW5nL3RhbGtzX2FuZF9wYXBlcnMvcXBfcGFwZXIvZmlndXJlcycpCmBgYAoKYGBge3J9CnByb2RfZGF0YSAlPiUKICBmaWx0ZXIoIWlzLm5hKHBvbGlfcGFydHkpKSAlPiUKICBmaWx0ZXIobW9ycGhfdHlwZSA9PSAiY29tcG91bmQiKSAlPiUKICBtdXRhdGUocmVzcG9uc2VfbmV1dHJhbCA9IGlmZWxzZShyZXNwb25zZV9nZW5kZXIgPT0gIm5ldXRyYWwiIHwgcmVzcG9uc2VfZ2VuZGVyID09ICJtYWxlL25ldXRyYWwiLDEsMCkpICU+JQogIGZpbHRlcihnZW5kZXIhPSJmaWxsZXIiICYgZ2VuZGVyIT0gImF0dGVudGlvbiIgJiBnZW5kZXIhPSIiKSAlPiUKICBncm91cF9ieShnZW5kZXIsbGV4ZW1lLHBvbGlfcGFydHksc3ViamVjdF9pbmZvcm1hdGlvbi5nZW5kZXIpICU+JQogIHN1bW1hcmlzZShwcm9wb3J0aW9uID0gbWVhbihyZXNwb25zZV9uZXV0cmFsKSkgJT4lCiAgZ3JvdXBfYnkoZ2VuZGVyLGxleGVtZSkgJT4lCiAgc3VtbWFyaXplKG1lYW5fcHJvcCA9IG1lYW4ocHJvcG9ydGlvbiksIENJLkxvdyA9IGNpLmxvdyhwcm9wb3J0aW9uKSwgQ0kuSGlnaCA9IGNpLmhpZ2gocHJvcG9ydGlvbikpICU+JQogIG11dGF0ZShZTWluID0gbWVhbl9wcm9wIC0gQ0kuTG93LCBZTWF4ID0gbWVhbl9wcm9wICsgQ0kuSGlnaCkgJT4lCiAgZ2dwbG90KGFlcyh4PWdlbmRlcix5PW1lYW5fcHJvcCxmaWxsPWdlbmRlcikpICsgCiAgZ2VvbV9iYXIoc3RhdD0naWRlbnRpdHknKSArIAogIGdlb21fZXJyb3JiYXIoYWVzKHltaW49WU1pbix5bWF4PVlNYXgpLHdpZHRoPS4yNSkgKyAKICBmYWNldF93cmFwKH5sZXhlbWUpICsgCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKSArIAogIGxhYnMoeD0iUGFydGljaXBhbnQgUG9saXRpY2FsIFBhcnR5IiwgeT0iTWVhbiBQcm9wb3J0aW9uIG9mIEdlbmRlci1OZXV0cmFsIFJlc3BvbnNlcyIsdGl0bGU9IlByb3BvcnRpb25zIG9mIE5ldXRyYWwgUmVzcG9uc2VzIGJ5IFN0aW11bGkgR2VuZGVyIiwgZmlsbD0iUG9saXRpY2FsIFBhcnR5IikgKyAKICB0aGVtZSh0ZXh0PWVsZW1lbnRfdGV4dChzaXplPTE2KSkgKyAKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZT0yMCkpICsKICB0aGVtZV9ncmV5KCkgCmBgYAoKYGBge3J9CnByb2RfZGF0YSAlPiUKICBmaWx0ZXIoIWlzLm5hKHBvbGlfcGFydHkpKSAlPiUKICBtdXRhdGUocmVzcG9uc2VfbmV1dHJhbCA9IGlmZWxzZShyZXNwb25zZV9nZW5kZXIgPT0gIm5ldXRyYWwiIHwgcmVzcG9uc2VfZ2VuZGVyID09ICJtYWxlL25ldXRyYWwiLDEsMCkpICU+JQogIGZpbHRlcihnZW5kZXIhPSJmaWxsZXIiICYgZ2VuZGVyIT0gImF0dGVudGlvbiIgJiBnZW5kZXIhPSIiKSAlPiUKICBncm91cF9ieShtb3JwaF90eXBlKSAlPiUKICBzdW1tYXJpemUobWVhbl9wcm9wID0gbWVhbihyZXNwb25zZV9uZXV0cmFsKSwgQ0kuTG93ID0gY2kubG93KHJlc3BvbnNlX25ldXRyYWwpLCBDSS5IaWdoID0gY2kuaGlnaChyZXNwb25zZV9uZXV0cmFsKSkgJT4lCiAgbXV0YXRlKFlNaW4gPSBtZWFuX3Byb3AgLSBDSS5Mb3csIFlNYXggPSBtZWFuX3Byb3AgKyBDSS5IaWdoKSAlPiUKICBnZ3Bsb3QoYWVzKHg9bW9ycGhfdHlwZSx5PW1lYW5fcHJvcCwgZmlsbD1tb3JwaF90eXBlKSkgKyAKICBnZW9tX2JhcihzdGF0PSdpZGVudGl0eScpICsgCiAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbj1ZTWluLHltYXg9WU1heCksd2lkdGg9LjI1KSArIAogIGxhYnMoeD0iTW9ycGhvbG9naWNhbCBQcm9jZXNzIiwgeT0iTWVhbiBQcm9wb3J0aW9uIG9mIE5ldXRyYWwgUmVzcG9uc2VzIikgKyAKICB0aGVtZSh0ZXh0PWVsZW1lbnRfdGV4dChzaXplPTE2KSkgKyAKICB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZT01LCB2anVzdCA9IC43KSkgKyAKICBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBicmFuX3BhbGV0dGUpICsKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAibm9uZSIpCmBgYAoKYGBge3J9Cmdnc2F2ZSgicHJvZF9uZXV0cmFsX21vcnBoX2Jhci5wbmciLCB3aWR0aD03LCBoZWlnaHQ9NSxwYXRoPScvVXNlcnMvYnJhbnBhcC9EZXNrdG9wL2dlbmRlcl9wcm9jZXNzaW5nL3RhbGtzX2FuZF9wYXBlcnMvcXBfcGFwZXIvZmlndXJlcycpCmBgYAoKYGBge3J9CnByb2RfZGF0YV9tZWFuc19hbGwgPC0gcHJvZF9kYXRhICU+JQogIGZpbHRlcighaXMubmEocG9saV9wYXJ0eSkpICU+JQogIG11dGF0ZShyZXNwb25zZV9uZXV0cmFsID0gaWZlbHNlKHJlc3BvbnNlX2dlbmRlciA9PSAibmV1dHJhbCIsMSwwKSkgJT4lCiAgZmlsdGVyKGdlbmRlciE9ImZpbGxlciIgJiBnZW5kZXIhPSAiYXR0ZW50aW9uIiAmIGdlbmRlciE9IiIpICU+JQogIGdyb3VwX2J5KGdlbmRlcix3b3JrZXJpZCxwb2xpX3BhcnR5LHN1YmplY3RfaW5mb3JtYXRpb24uZ2VuZGVyLHN1YmplY3RfaW5mb3JtYXRpb24uYWdlLHN1YmplY3RfaW5mb3JtYXRpb24uZWR1Y2F0aW9uLGdlbmRlcl90b3RhbCkgJT4lCiAgc3VtbWFyaXNlKHByb3BvcnRpb24gPSBtZWFuKHJlc3BvbnNlX25ldXRyYWwpKSAKYGBgCg==